Re: Differences between to_tsquery() and plainto_tsquery() when it comes to applying an index?

Поиск
Список
Период
Сортировка
От Denis Papathanasiou
Тема Re: Differences between to_tsquery() and plainto_tsquery() when it comes to applying an index?
Дата
Msg-id 4C7584E4.6000901@gmail.com
обсуждение исходный текст
Ответ на Re: Differences between to_tsquery() and plainto_tsquery() when it comes to applying an index?  (Oleg Bartunov <oleg@sai.msu.su>)
Список pgsql-general
> we need examples of your explain analyze. I don't want to waste my time
> reading theoretical reasoning :)

Here's an actual 'explain analyze' example:

alerts=> CREATE INDEX node_val_tsv_idx ON node USING
gin(to_tsvector('english', val));
CREATE INDEX
alerts=> explain analyze select item_pk from node where
tag='primaryIssuer.entityType' and val @@ plainto_tsquery('Limited
Partnership');
                                                          QUERY PLAN


-----------------------------------------------------------------------------------------------------------------------------
  Bitmap Heap Scan on node  (cost=204.26..5792.92 rows=4 width=16)
(actual time=2.952..131.868 rows=953 loops=1)
    Recheck Cond: (tag = 'primaryIssuer.entityType'::text)
    Filter: (val @@ plainto_tsquery('Limited Partnership'::text))
    ->  Bitmap Index Scan on node_tag_idx  (cost=0.00..204.26 rows=3712
width=0) (actual time=1.628..1.628 rows=3631 loops=1)
          Index Cond: (tag = 'primaryIssuer.entityType'::text)
  Total runtime: 133.345 ms
(6 rows)

alerts=> DROP INDEX node_val_tsv_idx;
DROP INDEX
alerts=> explain analyze select item_pk from node where
tag='primaryIssuer.entityType' and val @@ plainto_tsquery('Limited
Partnership');
                                                          QUERY PLAN


-----------------------------------------------------------------------------------------------------------------------------
  Bitmap Heap Scan on node  (cost=204.26..5792.92 rows=4 width=16)
(actual time=2.938..93.239 rows=953 loops=1)
    Recheck Cond: (tag = 'primaryIssuer.entityType'::text)
    Filter: (val @@ plainto_tsquery('Limited Partnership'::text))
    ->  Bitmap Index Scan on node_tag_idx  (cost=0.00..204.26 rows=3712
width=0) (actual time=1.614..1.614 rows=3631 loops=1)
          Index Cond: (tag = 'primaryIssuer.entityType'::text)
  Total runtime: 94.696 ms
(6 rows)

The table this is run against is defined like this:

CREATE TABLE node (
     pk uuid primary key,
     item_pk uuid not null references item (pk),
     tag text not null,
     val text
);

In addition to the gin/ts_vector index on node.val shown above, there
are two other explicit indices on this table:

CREATE INDEX node_tag_idx ON node (tag);
CREATE INDEX node_val_idx ON node (val);

The reason for the node_val_idx index is that there will be cases where
the query phrase is known exactly, so the where clause in the select
statement will be just "val = 'Limited Partnership'".

> btw, Be sure you use the same search configuration as in create index or
> index will not be used at all.

Is this indeed the problem here?

The explain output references "val @@ plainto_tsquery()" but as a
filter, whereas the tag portion of the statement mentions node_tag_idx
as the index it used.

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

В списке pgsql-general по дате отправления:

Предыдущее
От: Bill Christensen
Дата:
Сообщение: Re: Problem with dumps
Следующее
От: PMC OS
Дата:
Сообщение: Re: How to setup PostgreSQL to work with libpam-pgsql/libnss-pgsql2?