Query not using index - Mailing list pgsql-general

From Troy Rasiah
Subject Query not using index
Date
Msg-id 48D73578.3090805@vicnet.net.au
Whole thread Raw
List 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
itthen uses the index. Below is the explain analyse. The first explain analyse is the one i'm having problems with. The
secondexplain 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=13991loops=1) 
                           ->  Bitmap Heap Scan on keyword_data k  (cost=29.14..2597.89 rows=994 width=39) (actual
time=942.640..1067.716rows=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.784rows=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=3width=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.021rows=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=35613loops=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.487rows=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.614rows=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=2width=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.014rows=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.012rows=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


pgsql-general by date:

Previous
From: Reg Me Please
Date:
Subject: Re: PDF Documentation for 8.3?
Next
From: Tino Wildenhain
Date:
Subject: Re: PL/Python - Execute return results