Thread: Is this expected? (Index scanning)
Indexes on both void and lower(cust_name) here.. I get -> EXPLAIN select * from invoice_master WHERE lower(cust_name) like 'mitch' AND void = 'f' order by created LIMIT 100; NOTICE: QUERY PLAN: Limit (cost=2241.98..2241.98 rows=100 width=319) -> Sort (cost=2241.98..2241.98 rows=604 width=319) -> Index Scan using invoice_cust_name on invoice_master (cost=0.00..2214.09 rows=604 width=319) The above query matches zero rows. EXPLAIN SELECT * FROM invoice_master WHERE lower(cust_name) like '%mitch' AND void = 'f' ORDER BY created LIMIT 100; NOTICE: QUERY PLAN: Limit (cost=4310.65..4310.65 rows=1 width=319) -> Sort (cost=4310.65..4310.65 rows=1 width=319) -> Seq Scan on invoice_master (cost=0.00..4310.64 rows=1 width=319) The above query matches zero rows. EXPLAIN SELECT * FROM invoice_master WHERE lower(cust_name) like 'mitch%' AND void = 'f' ORDER BY created LIMIT 100; NOTICE: QUERY PLAN: Limit (cost=2241.98..2241.98 rows=100 width=319) -> Sort (cost=2241.98..2241.98 rows=604 width=319) -> Index Scan using invoice_cust_name on invoice_master (cost=0.00..2214.09 rows=604 width=319) The above query matches 53 rows.. PostgreSQL 7.1.1, FreeBSD 4.2, 73408 records in the invoice_master table and it's all freshly vacuum analyze 'd... I'm just wondering if I'm doing something extremely silly here.. Thanks!! -Mitch
On Sun, 6 May 2001, Mitch Vincent wrote: > Indexes on both void and lower(cust_name) here.. > > I get -> > > EXPLAIN select * from invoice_master WHERE lower(cust_name) like 'mitch' AND > void = 'f' order by created LIMIT 100; > NOTICE: QUERY PLAN: > > Limit (cost=2241.98..2241.98 rows=100 width=319) > -> Sort (cost=2241.98..2241.98 rows=604 width=319) > -> Index Scan using invoice_cust_name on invoice_master > (cost=0.00..2214.09 rows=604 width=319) > > The above query matches zero rows. > > EXPLAIN SELECT * FROM invoice_master WHERE lower(cust_name) like '%mitch' > AND void = 'f' ORDER BY created LIMIT 100; > NOTICE: QUERY PLAN: > > Limit (cost=4310.65..4310.65 rows=1 width=319) > -> Sort (cost=4310.65..4310.65 rows=1 width=319) > -> Seq Scan on invoice_master (cost=0.00..4310.64 rows=1 > width=319) > > The above query matches zero rows. > > EXPLAIN SELECT * FROM invoice_master WHERE lower(cust_name) like 'mitch%' > AND void = 'f' ORDER BY created LIMIT 100; > NOTICE: QUERY PLAN: > > Limit (cost=2241.98..2241.98 rows=100 width=319) > -> Sort (cost=2241.98..2241.98 rows=604 width=319) > -> Index Scan using invoice_cust_name on invoice_master > (cost=0.00..2214.09 rows=604 width=319) > > The above query matches 53 rows.. In the first and last case the like is anchored at the beginning so it uses the name index. The middle case can't use that index, and how well distributed are the values of void (is it a boolean?)? It's likely that the index isn't very selective, if most of the rows are void='f' then that index is probably more expensive to scan than the sequence scan would be.
> In the first and last case the like is anchored at the beginning so it > uses the name index. The middle case can't use that index, and how > well distributed are the values of void (is it a boolean?)? Ahh... I thought that the middle case could use an index, I guess that's why I was confused.. >It's likely > that the index isn't very selective, if most of the rows are void='f' > then that index is probably more expensive to scan than the sequence scan > would be. Yep, most of the rows are void='f'.. Thanks!! -Mitch