Regexps and Indices.

Started by Brian Piatkusalmost 23 years ago7 messagesgeneral
Jump to latest
#1Brian Piatkus
Brian@fulcrum.plus.com

Hi,
I'm sure that this has come up many times before but :

I have just upgraded from 7.0.2 to 7.2.2 using the latest Mandrake 9.0 RPMS.
The database structure is unchanged but I now find that the db refuses to use
the available index WHERE NAME ~ '^NAME' even with enable_seqscan set off. Am
I missing something ?

Table "t_patient"
Column | Type |
Modifiers
----------------------+-----------------------+---------------------------------------------------
prn | integer | not null default
nextval('patient_prn_seq'::text)
caseno | character(14) | not null
surname | character varying(20) | not null
forename | character varying(16) |
dob | date |
approx_date | boolean |
sex | character(1) |
hospital | character(4) |
ward | character(4) |
cons_type | character(1) |
cons_attr | character(4) |
consultant | text |
maiden_name | character varying(20) |
nhs_no | character varying(16) |
pat_address | text |
cardinal_blood_group | character varying(16) |
displist | character(8) |

Indexes: t_patient_caseno,
t_patient_mn_fn,
t_patient_surname_forename
Unique keys: t_patient_prn

pathology=# explain select * from t_patient where surname ~ '^SMIT';
NOTICE: QUERY PLAN:

Seq Scan on t_patient (cost=100000000.00..100000440.89 rows=64 width=245)

EXPLAIN
pathology=# set enable_seqscan to off;
SET VARIABLE
pathology=# explain select * from t_patient where surname ~ '^SMIT';
NOTICE: QUERY PLAN:

Seq Scan on t_patient (cost=100000000.00..100000440.89 rows=64 width=245)

EXPLAIN

#2Jonathan Bartlett
johnnyb@eskimo.com
In reply to: Brian Piatkus (#1)
Re: Regexps and Indices.

It's probaly because you only have 64 rows.

If you have more, you need to rerun vacuum analyze;

Jon

On Tue, 22 Apr 2003, Brian Piatkus wrote:

Show quoted text

Hi,
I'm sure that this has come up many times before but :

I have just upgraded from 7.0.2 to 7.2.2 using the latest Mandrake 9.0 RPMS.
The database structure is unchanged but I now find that the db refuses to use
the available index WHERE NAME ~ '^NAME' even with enable_seqscan set off. Am
I missing something ?

Table "t_patient"
Column | Type |
Modifiers
----------------------+-----------------------+---------------------------------------------------
prn | integer | not null default
nextval('patient_prn_seq'::text)
caseno | character(14) | not null
surname | character varying(20) | not null
forename | character varying(16) |
dob | date |
approx_date | boolean |
sex | character(1) |
hospital | character(4) |
ward | character(4) |
cons_type | character(1) |
cons_attr | character(4) |
consultant | text |
maiden_name | character varying(20) |
nhs_no | character varying(16) |
pat_address | text |
cardinal_blood_group | character varying(16) |
displist | character(8) |

Indexes: t_patient_caseno,
t_patient_mn_fn,
t_patient_surname_forename
Unique keys: t_patient_prn

pathology=# explain select * from t_patient where surname ~ '^SMIT';
NOTICE: QUERY PLAN:

Seq Scan on t_patient (cost=100000000.00..100000440.89 rows=64 width=245)

EXPLAIN
pathology=# set enable_seqscan to off;
SET VARIABLE
pathology=# explain select * from t_patient where surname ~ '^SMIT';
NOTICE: QUERY PLAN:

Seq Scan on t_patient (cost=100000000.00..100000440.89 rows=64 width=245)

EXPLAIN

---------------------------(end of broadcast)---------------------------
TIP 2: you can get off all lists at once with the unregister command
(send "unregister YourEmailAddressHere" to majordomo@postgresql.org)

#3Stephan Szabo
sszabo@megazone23.bigpanda.com
In reply to: Brian Piatkus (#1)
Re: Regexps and Indices.

On Tue, 22 Apr 2003, Brian Piatkus wrote:

Hi,
I'm sure that this has come up many times before but :

I have just upgraded from 7.0.2 to 7.2.2 using the latest Mandrake 9.0 RPMS.
The database structure is unchanged but I now find that the db refuses to use
the available index WHERE NAME ~ '^NAME' even with enable_seqscan set off. Am
I missing something ?

It's possible that you initialized the database in something other than
"C" locale which disables the optimization that uses indexes for
regexp/like (see past discussions in the archives for details).

#4Brian Piatkus
Brian@fulcrum.plus.com
In reply to: Stephan Szabo (#3)
Re: Regexps and Indices.

Hi
It turns out to be more than possible. Locale is set by default to en_GB.
Am I right in assuming that I need only to set LANG=C ? and should I also do
this for the environment of the running postmaster ?

Show quoted text

On Tuesday 22 Apr 2003 20:59, you wrote:

On Tue, 22 Apr 2003, Brian Piatkus wrote:

Hi,
I'm sure that this has come up many times before but :

I have just upgraded from 7.0.2 to 7.2.2 using the latest Mandrake 9.0
RPMS. The database structure is unchanged but I now find that the db
refuses to use the available index WHERE NAME ~ '^NAME' even with
enable_seqscan set off. Am I missing something ?

It's possible that you initialized the database in something other than
"C" locale which disables the optimization that uses indexes for
regexp/like (see past discussions in the archives for details).

---------------------------(end of broadcast)---------------------------
TIP 4: Don't 'kill -9' the postmaster

#5Tom Lane
tgl@sss.pgh.pa.us
In reply to: Brian Piatkus (#4)
Re: Regexps and Indices.

Brian Piatkus <Brian@fulcrum.plus.com> writes:

It turns out to be more than possible. Locale is set by default to en_GB.
Am I right in assuming that I need only to set LANG=C ? and should I also do
this for the environment of the running postmaster ?

You need to re-do initdb with LANG=C in its environment. Pain in the
neck, I know.

regards, tom lane

#6Dennis Gearon
gearond@cvc.net
In reply to: Brian Piatkus (#4)
Re: Regexps and Indices.

BTW, What **IS** the the language 'C'? I don't talk to people like:

'if( !happy(honey)){
what_went_wrong_today();
}'

;-)

Brian Piatkus wrote:

Show quoted text

Hi
It turns out to be more than possible. Locale is set by default to en_GB.
Am I right in assuming that I need only to set LANG=C ? and should I also do
this for the environment of the running postmaster ?

On Tuesday 22 Apr 2003 20:59, you wrote:

On Tue, 22 Apr 2003, Brian Piatkus wrote:

Hi,
I'm sure that this has come up many times before but :

I have just upgraded from 7.0.2 to 7.2.2 using the latest Mandrake 9.0
RPMS. The database structure is unchanged but I now find that the db
refuses to use the available index WHERE NAME ~ '^NAME' even with
enable_seqscan set off. Am I missing something ?

It's possible that you initialized the database in something other than
"C" locale which disables the optimization that uses indexes for
regexp/like (see past discussions in the archives for details).

---------------------------(end of broadcast)---------------------------
TIP 4: Don't 'kill -9' the postmaster

---------------------------(end of broadcast)---------------------------
TIP 4: Don't 'kill -9' the postmaster

#7Brian Piatkus
Brian@fulcrum.plus.com
In reply to: Tom Lane (#5)
Re: Regexps and Indices.

Tom,
I'm really impressed with the way people chip in with answers & actually help
solve the problem too !
I've done a lot of browsing the archives & a bit of testing with my sample
db. I cant get LANG=C to work but LC_ALL=C does so I'm a bit confused. Still,
if it works and ain't broke .....

Thanks for the helpful tips.

Regards

Show quoted text

On Wednesday 23 Apr 2003 15:16, you wrote:

Brian Piatkus <Brian@fulcrum.plus.com> writes:

It turns out to be more than possible. Locale is set by default to en_GB.
Am I right in assuming that I need only to set LANG=C ? and should I also
do this for the environment of the running postmaster ?

You need to re-do initdb with LANG=C in its environment. Pain in the
neck, I know.

regards, tom lane