Hallo zusammen,
ich habe eine Frage zu der Postgres Volltextsuche (inkl. Index):
In einer meiner Tabellen liegen ca. 1600000 Datensätze mit Produktinformationen (Produktbeschreibung, Preise,…).
Damit die Suche nach Produkten effektiv durchgeführt werden kann habe ich eine weitere Spalte in die Tabelle ergänzt und mit Suchdaten befüllt:
alter table product add column searchindex tsvector;
update product set searchindex=to_tsvector('german', title || ' ' || desc_short || ' ' || desc_long);
Anschließend habe ich einen Index für die neue Spalte erzeugt:
create index searchindex_idx on product using gist(searchindex);
Wenn ich jetzt eine Suche durchführe, dann dauert das erstmalige Suchen nach einem Suchbegriff um ein vielfaches länger als die darauffolgenden Suchen nach dem gleichen Suchbegriff
select title from product where searchindex @@ to_tsquery('german', 'Badezusatz');
Ein EXPLAIN ANALYZE ergibt folgenden Output (Lauf 1)
"Bitmap Heap Scan on product (cost=74.84..3134.82 rows=814 width=37) (actual time=6602.427..7529.790 rows=197 loops=1)"
" Recheck Cond: (searchindex @@ '''badezusatz'''::tsquery)"
" -> Bitmap Index Scan on searchindex_idx (cost=0.00..74.64 rows=814 width=0) (actual time=3058.503..3058.503 rows=1003 loops=1)"
" Index Cond: (searchindex @@ '''badezusatz'''::tsquery)"
"Total runtime: 7530.378 ms"
Ein EXPLAIN ANALYZE ergibt folgenden Output (Lauf 2)
"Bitmap Heap Scan on product (cost=74.84..3134.82 rows=814 width=37) (actual time=80.682..85.084 rows=197 loops=1)"
" Recheck Cond: (searchindex @@ '''badezusatz'''::tsquery)"
" -> Bitmap Index Scan on searchindex_idx (cost=0.00..74.64 rows=814 width=0) (actual time=57.649..57.649 rows=1003 loops=1)"
" Index Cond: (searchindex @@ '''badezusatz'''::tsquery)"
"Total runtime: 85.439 ms"
Kann mir jemand sagen, warum das erstmalige SELECT länger dauert, wie die darauffolgenden SELECTS?
Kann ich etwas verändern, um die Performance hier zu erhöhen?
Ich nutze Postgres 9.1 auf einem Ubuntu Server.
Schonmal vielen Dank!