Search Postgresql Archives

text search query planning

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

I've a problem understanding of slow query. I use 8.4 for storing
syslog messages, on which i want to do text searching. This table:

syslog=# \d fw_msgs
   Table "public.fw_msgs"
  Column  | Type | Modifiers 
----------+------+-----------
 datetime | text | 
 facility | text | 
 level    | text | 
 host     | text | 
 program  | text | 
 pid      | text | 
 message  | text | 
Indexes:
    "fw_msgs_datetime_idx" btree (datetime)
    "fw_msgs_facility_idx" btree (facility)
    "fw_msgs_host_idx" btree (host)
    "fw_msgs_idx" gin (to_tsvector('english'::regconfig, message))
    "fw_msgs_program_idx" btree (program)

contains millions of records.

This query is fast:

syslog=# explain select datetime,facility,level,host,program,pid,message from fw_msgs where to_tsvector('english', message) @@ to_tsquery ('131.211.1.124')  limit 3000;
                                                 QUERY PLAN                                                  
-------------------------------------------------------------------------------------------------------------
 Limit  (cost=17658.01..25225.08 rows=3000 width=176)
   ->  Bitmap Heap Scan on fw_msgs  (cost=17658.01..181537.99 rows=64971 width=176)
         Recheck Cond: (to_tsvector('english'::regconfig, message) @@ to_tsquery('131.211.1.124'::text))
         ->  Bitmap Index Scan on fw_msgs_idx  (cost=0.00..17641.77 rows=64971 width=0)
               Index Cond: (to_tsvector('english'::regconfig, message) @@ to_tsquery('131.211.1.124'::text))
(5 rows)

However, when I want to order by datetime, it takes for ever. It seems the db
insist on first sorting on datetime instead of using the gin index:

syslog=# explain select datetime,facility,level,host,program,pid,message from fw_msgs where to_tsvector('english', message) @@ to_tsquery ('131.211.1.124')  order by datetime limit 3000;
                                             QUERY PLAN                                              
-----------------------------------------------------------------------------------------------------
 Limit  (cost=0.00..44985.68 rows=3000 width=176)
   ->  Index Scan using fw_msgs_datetime_idx on fw_msgs  (cost=0.00..974644.66 rows=64997 width=176)
         Filter: (to_tsvector('english'::regconfig, message) @@ to_tsquery('131.211.1.124'::text))
(3 rows)

doing something like 

select datetime,facility,level,host,program,pid,message from fw_msgs where message in (select message from fw_msgs where to_tsvector('english', message) @@ to_tsquery ('131.211.1.124') ) order by datetime desc limit 3000;


doesn't help.

Any ideas?

Regards,
-- 
Henk van Lingen,                                              (o-      -+
Netwerk & Telefonie, ICT Service Center                       /\        |
Universiteit Utrecht, Jenalaan 18a, kamer 0.12                v_/_
http://henk.vanlingen.net/             http://www.tuxtown.net/netiquette/

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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux