Query not using index

From: Troy Rasiah <troyr(at)vicnet(dot)net(dot)au>
To: pgsql-general(at)postgresql(dot)org
Subject: Query not using index
Date: 2008-09-22 06:04:40
Message-ID: 48D73578.3090805@vicnet.net.au
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general


hello all,

I'm having troubles getting the following statement to use the index on 'gazette'. If i remove the order by condition it then uses the index. Below is the explain analyse. The first explain analyse is the one i'm having problems with. The second explain analyse is from a different database that has the same structure as the first, but does not hold as much data.

Both databases reside on the same server - Postgres 8.3.3
Table definitions are below.

Tables have been analysed, i'm still a novice at reading these query plans so if anyone has any ideas it would be much appreciated

gazette=# explain analyse SELECT
k.keyword,p.page_no,k.subtopic
FROM
keyword_data k,pages_new p,keyword_page_linkup kp,gazette g
WHERE
g.id = p.gazette
AND kp.keyword_id = k.id
AND kp.page_id = p.id
AND idxfti @@ to_tsquery('english', 'water&!supply&!inspector&!officer&!clerk')
ORDER BY
g.gaz_date ASC,
g.gaz_no ASC
limit 20 OFFSET 60;
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Limit (cost=12243.81..12243.86 rows=20 width=46) (actual time=2019.555..2019.573 rows=20 loops=1)
-> Sort (cost=12243.66..12247.81 rows=1661 width=46) (actual time=2019.513..2019.547 rows=80 loops=1)
Sort Key: g.gaz_date, g.gaz_no
Sort Method: top-N heapsort Memory: 26kB
-> Hash Join (cost=1437.43..12182.85 rows=1661 width=46) (actual time=1122.213..1974.885 rows=13991 loops=1)
Hash Cond: (p.gazette = g.id)
-> Nested Loop (cost=29.14..10735.11 rows=1661 width=43) (actual time=942.933..1739.010 rows=13991 loops=1)
-> Nested Loop (cost=29.14..8588.65 rows=1661 width=39) (actual time=942.825..1401.104 rows=13991 loops=1)
-> Bitmap Heap Scan on keyword_data k (cost=29.14..2597.89 rows=994 width=39) (actual time=942.640..1067.716 rows=7513 loops=1)
Filter: (idxfti @@ '''water'' & !''suppli'' & !''inspector'' & !''offic'' & !''clerk'''::tsquery)
-> Bitmap Index Scan on idxfti_idx (cost=0.00..28.89 rows=994 width=0) (actual time=940.784..940.784 rows=7514 loops=1)
Index Cond: (idxfti @@ '''water'' & !''suppli'' & !''inspector'' & !''offic'' & !''clerk'''::tsquery)
-> Index Scan using keyword_page_linkup_idx on keyword_page_linkup kp (cost=0.00..5.99 rows=3 width=8) (actual time=0.036..0.040 rows=2 loops=7513)
Index Cond: (kp.keyword_id = k.id)
-> Index Scan using pages_new_pkey on pages_new p (cost=0.00..1.28 rows=1 width=12) (actual time=0.018..0.021 rows=1 loops=13991)
Index Cond: (p.id = kp.page_id)
-> Hash (cost=963.13..963.13 rows=35613 width=11) (actual time=179.166..179.166 rows=35613 loops=1)
-> Seq Scan on gazette g (cost=0.00..963.13 rows=35613 width=11) (actual time=0.085..137.694 rows=35613 loops=1)
Total runtime: 2019.933 ms
(19 rows)

govt_gazette=# explain analyse SELECT
k.keyword,p.page_no,k.subtopic
FROM
keyword_data k,pages_new p,keyword_page_linkup kp,gazette g
WHERE
g.id = p.gazette
AND kp.keyword_id = k.id
AND kp.page_id = p.id
AND idxfti @@ to_tsquery('english', 'water&!supply&!inspector&!officer&!clerk')
ORDER BY
g.gaz_date ASC,
g.gaz_no ASC
limit 20 OFFSET 60;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Limit (cost=2758.13..2758.18 rows=20 width=49) (actual time=127.582..127.596 rows=20 loops=1)
-> Sort (cost=2757.98..2758.84 rows=344 width=49) (actual time=127.544..127.568 rows=80 loops=1)
Sort Key: g.gaz_date, g.gaz_no
Sort Method: top-N heapsort Memory: 23kB
-> Nested Loop (cost=14.16..2745.38 rows=344 width=49) (actual time=34.196..120.869 rows=1777 loops=1)
-> Nested Loop (cost=14.16..2640.70 rows=344 width=46) (actual time=34.143..92.118 rows=1777 loops=1)
-> Nested Loop (cost=14.16..2539.09 rows=344 width=42) (actual time=34.092..62.106 rows=1777 loops=1)
-> Bitmap Heap Scan on keyword_data k (cost=14.16..593.02 rows=231 width=42) (actual time=33.937..39.487 rows=975 loops=1)
Recheck Cond: (idxfti @@ '''water'' & !''suppli'' & !''inspector'' & !''offic'' & !''clerk'''::tsquery)
-> Bitmap Index Scan on idxfti_idx (cost=0.00..14.10 rows=231 width=0) (actual time=33.614..33.614 rows=975 loops=1)
Index Cond: (idxfti @@ '''water'' & !''suppli'' & !''inspector'' & !''offic'' & !''clerk'''::tsquery)
-> Index Scan using keyword_page_linkup_idx on keyword_page_linkup kp (cost=0.00..8.40 rows=2 width=8) (actual time=0.016..0.019 rows=2 loops=975)
Index Cond: (kp.keyword_id = k.id)
-> Index Scan using pages_new_pkey on pages_new p (cost=0.00..0.28 rows=1 width=12) (actual time=0.012..0.014 rows=1 loops=1777)
Index Cond: (p.id = kp.page_id)
-> Index Scan using gazette_pkey on gazette g (cost=0.00..0.29 rows=1 width=11) (actual time=0.010..0.012 rows=1 loops=1777)
Index Cond: (g.id = p.gazette)
Total runtime: 127.966 ms
(18 rows)

Below are the relevant table definitions

gazette=# \d gazette
Table "public.gazette"
Column | Type | Modifiers
------------------+-------------------+------------------------------------------------------
year | integer |
doctype | character varying |
ggtype | character varying |
old_vol | character varying |
vol | integer | default 0
sequence | integer | default 0
pagerange | character varying |
year_start_page | integer | default 0
year_finish_page | integer | default 0
ggtype_display | character varying |
lr_type | character varying |
gaz_start_page | integer | default 0
style | character varying |
missing | character varying |
gaz_date | date |
ref_gaz_date | date |
page_qty | character varying |
gaz_no | character varying |
remarks | character varying |
type | character varying |
cat_no | character varying |
page_of_pgs | character varying |
day | character varying |
web_remarks | character varying |
id | integer | not null default nextval('gazette_id_seq'::regclass)
Indexes:
"gazette_pkey" PRIMARY KEY, btree (id)
"gazette_idx" btree (year)
"gazette_idx1" btree (year, doctype, ggtype)
"gazette_idx2" btree (year, doctype, ggtype, lr_type)
"gazette_idx3" btree (gaz_date)

gazette=# \d pages_new
Table "public.pages_new"
Column | Type | Modifiers
---------+-------------------+--------------------------------------------------------
id | integer | not null default nextval('pages_new_id_seq'::regclass)
page_no | character varying |
gazette | integer |
Indexes:
"pages_new_pkey" PRIMARY KEY, btree (id)
"pages_new_idx" UNIQUE, btree (page_no, gazette)
"pages_new_idx1" btree (gazette)
Foreign-key constraints:
"pages_new_fk" FOREIGN KEY (gazette) REFERENCES gazette(id) ON UPDATE CASCADE ON DELETE CASCADE

gazette=# \d keyword_data
Table "public.keyword_data"
Column | Type | Modifiers
----------+-------------------+-----------------------------------------------------------
id | integer | not null default nextval('keyword_data_id_seq'::regclass)
keyword | character varying | not null
category | integer | not null
subtopic | character varying |
idxfti | tsvector |
Indexes:
"keyword_data_pkey" PRIMARY KEY, btree (id)
"idxfti_idx" gist (idxfti)
"keyword_data_idx" btree (category)
"keyword_data_idx1" btree (keyword)
Foreign-key constraints:
"keyword_data_fk" FOREIGN KEY (category) REFERENCES categorys(categoryid) ON UPDATE CASCADE ON DELETE CASCADE

gazette=# \d keyword_page_linkup
Table "public.keyword_page_linkup"
Column | Type | Modifiers
------------+---------+------------------------------------------------------------------
id | integer | not null default nextval('keyword_page_linkup_id_seq'::regclass)
keyword_id | integer | not null
page_id | integer |
Indexes:
"keyword_page_linkup_pkey" PRIMARY KEY, btree (id)
"keyword_page_linkup_idx" btree (keyword_id)
"keyword_page_linkup_idx1" btree (page_id)
Foreign-key constraints:
"keyword_page_linkup_fk" FOREIGN KEY (keyword_id) REFERENCES keyword_data(id) ON UPDATE CASCADE ON DELETE CASCADE
"keyword_page_linkup_fk1" FOREIGN KEY (page_id) REFERENCES pages_new(id) ON UPDATE CASCADE ON DELETE CASCADE

--
Troy Rasiah

Browse pgsql-general by date

  From Date Subject
Next Message Tino Wildenhain 2008-09-22 06:26:06 Re: PL/Python - Execute return results
Previous Message Reg Me Please 2008-09-22 05:17:36 Re: PDF Documentation for 8.3?