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


-- 
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

Reply via email to