Die Ausführung von Volltextabfragen für diese Datenbank (Speichern von RT- Tickets ( Request Tracker )) scheint sehr lange zu dauern. Die Anhangstabelle (die die Volltextdaten enthält) umfasst ca. 15 GB.
Das Datenbankschema lautet wie folgt: Es sind ungefähr 2 Millionen Zeilen:
rt4 = # \ d + Anhänge Tabelle "public.attachments" Spalte | Geben Sie | ein Modifikatoren | Lagerung | Beschreibung ----------------- + ----------------------------- + - -------------------------------------------------- ------ + ---------- + ------------- id | Ganzzahl | nicht null default nextval ('attachments_id_seq' :: regclass) | schlicht | Transaktions-ID | Ganzzahl | nicht null | schlicht | Eltern | Ganzzahl | nicht null default 0 | schlicht | messageid | Zeichen variierend (160) | | erweitert | Betreff | Zeichen variierend (255) | | erweitert | Dateiname | Zeichen variierend (255) | | erweitert | Inhaltstyp | Zeichen variierend (80) | | erweitert | contentencoding | Zeichen variierend (80) | | erweitert | Inhalt | Text | | erweitert | Überschriften | Text | | erweitert | Schöpfer | Ganzzahl | nicht null default 0 | schlicht | erstellt | Zeitstempel ohne Zeitzone | | schlicht | Inhaltsindex | tsvector | | erweitert | Indizes: "attachments_pkey" PRIMARY KEY, btree (id) "Anhang1" btree (Elternteil) "Anhang2" btree (Transaktions-ID) "attachments3" btree (Eltern, Transaktions-ID) "contentindex_idx" gin (contentindex) Hat OIDs: nein
Ich kann die Datenbank sehr schnell (<1s) selbst abfragen, mit einer Abfrage wie:
select objectid
from attachments
join transactions on attachments.transactionid = transactions.id
where contentindex @@ to_tsquery('frobnicate');
Wenn RT jedoch eine Abfrage ausführt, die eine Volltextindexsuche für dieselbe Tabelle durchführen soll, dauert der Abschluss normalerweise Hunderte von Sekunden. Die Ausgabe der Abfrageanalyse lautet wie folgt:
Abfrage
SELECT COUNT(DISTINCT main.id)
FROM Tickets main
JOIN Transactions Transactions_1 ON ( Transactions_1.ObjectType = 'RT::Ticket' )
AND ( Transactions_1.ObjectId = main.id )
JOIN Attachments Attachments_2 ON ( Attachments_2.TransactionId = Transactions_1.id )
WHERE (main.Status != 'deleted')
AND ( ( ( Attachments_2.ContentIndex @@ plainto_tsquery('frobnicate') ) ) )
AND (main.Type = 'ticket')
AND (main.EffectiveId = main.id);
EXPLAIN ANALYZE
Ausgabe
Abfrageplan -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------- Aggregat (Kosten = 51210.60..51210.61 Zeilen = 1 Breite = 4) (tatsächliche Zeit = 477778.806..477778.806 Zeilen = 1 Schleifen = 1) -> Verschachtelte Schleife (Kosten = 0,00..51210,57 Zeilen = 15 Breite = 4) (tatsächliche Zeit = 17943,986..477775,174 Zeilen = 4197 Schleifen = 1) -> Verschachtelte Schleife (Kosten = 0,00..40643.08 Zeilen = 6507 Breite = 8) (tatsächliche Zeit = 8.526..20610.380 Zeilen = 1714818 Schleifen = 1) -> Seq Scan auf Tickets main (Kosten = 0,00..9818,37 Zeilen = 598 Breite = 8) (tatsächliche Zeit = 0,008..256,042 Zeilen = 96990 Schleifen = 1) Filter: (((Status) :: Text 'gelöscht' :: Text) UND (id = effektive ID) UND ((Typ) :: Text = 'Ticket' :: Text)) -> Index-Scan mit Transaktionen1 für Transaktionen Transaktionen_1 (Kosten = 0,00..51,36 Zeilen = 15 Breite = 8) (tatsächliche Zeit = 0,102..0,202 Zeilen = 18 Schleifen = 96990) Index Cond: (((Objekttyp) :: text = 'RT :: Ticket' :: Text) AND (objectid = main.id)) -> Index-Scan mit Anhängen2 für Anhänge Anhang_2 (Kosten = 0,00..1,61 Zeilen = 1 Breite = 4) (tatsächliche Zeit = 0,266..0,266 Zeilen = 0 Schleifen = 1714818) Index Cond: (transactionid = transaction_1.id) Filter: (contentindex @@ plago_tsquery ('frobnicate' :: text)) Gesamtlaufzeit: 477778,883 ms
Soweit ich das beurteilen kann, scheint das Problem darin zu bestehen, dass nicht der für contentindex
field ( contentindex_idx
) erstellte Index verwendet wird , sondern ein Filter für eine große Anzahl übereinstimmender Zeilen in der Anhangstabelle ausgeführt wird. Die ANALYZE
Zeilenanzahl in der EXPLAIN- Ausgabe scheint auch nach einer kürzlichen Zeit sehr ungenau zu sein : geschätzte Zeilen = 6507 tatsächliche Zeilen = 1714818.
Ich bin mir nicht sicher, wohin ich als nächstes gehen soll.