2016-08-10 2 views
1

Ich versuche, eine Suche von etwa 10 Millionen Zeilen gegen primary_entity_name zu starten. Jedes Mal, wenn fq über ein Leerzeichen verfügt, überschreitet die Abfrage jedoch das Zeitlimit.PostgreSQL Multi-Word-Zeichenfolge Vergleich Zeitüberschreitungen

// "dog" works 
// "walking dog" times out 

select * 
from companies 
where primary_entity_name LIKE '%walking dog%' 
limit 10 

erklären (Analyse auf, Puffer auf)

Limit (cost=0.00..21551.17 rows=10 width=1542) (actual time=52210.872..269801.658 rows=6 loops=1) 
    Buffers: shared hit=1429 read=2115468 
    -> Seq Scan on companies (cost=0.00..2247787.26 rows=1043 width=1542) (actual time=52210.871..269801.644 rows=6 loops=1) 
     Filter: ((primary_entity_name)::text ~~ '%walking dog%'::text) 
     Rows Removed by Filter: 10471215 
     Buffers: shared hit=1429 read=2115468 
Planning time: 0.113 ms 
Execution time: 269801.687 ms 

Abfrage-Plan

Limit (cost=0.00..41950.28 rows=10 width=1569) 
    -> Seq Scan on companies (cost=0.00..1959078.25 rows=467 width=1569) 
    Filter: ((primary_entity_name)::text ~~ '%walking dog%'::text) 
+0

Sie sollten die tatsächlichen Abfragen nehmen, führen Sie sie mit EXPLAIN (ANALYSE, BUFFERS) und veröffentlichen Sie die beiden Pläne. –

+0

Danke - Bitte siehe oben @LaurenzAlbe – Will

Antwort

0

Ich denke, es ist nur ein Zufall, dass Sie die lange Dauer mit einer beobachtet Suchwort, das ein Leerzeichen enthält. Probieren Sie ein paar Mal mit verschiedenen Saiten.

Es könnte sein, dass die Länge des Suchbegriffs hat einen gewissen Einfluss, aber die überwältigende Leistung Schwein in dieser Abfrage ist I/O.

Aus dem Ausführungsplan können Sie sehen, dass die Abfrage etwa 16 GB von der Festplatte lesen und 10 Millionen Zeilen durchsuchen muss, um die 6 übereinstimmenden zu finden. Diese Kosten bleiben gleich, egal, wie Ihr Suchmuster aussieht, solange es mit einer % beginnt.

Wenn Sie wirklich müssen nach Strings in der Mitte eines Strings suchen, sollten Sie sich PostgreSQL Volltext-Suchfunktionen, die genau den Anwendungsfall adressieren, die Sie in Ihrem Beispiel zeigen. Wenn Sie Zeichenfolgen auch in der Mitte von Wörtern suchen müssen, wird es schwieriger – Sie möchten vielleicht pg_trgm auschecken.

+0

Wenn ich nur 'primary_entity_name'' 'wähle, reduziert sich die Abfragezeit auf weniger als zwei Sekunden. – Will

+0

Wie sieht die Abfrage aus und was ist ihr Ausführungsplan? –

+0

Der Abfrageplan wurde dem ursprünglichen Post hinzugefügt. – Will

Verwandte Themen