Ich habe ein Problem mit einem Stück Code, ich kann nicht verstehen, warum die folgende Abfrage einen vollständigen Tabellenscan in der Arbeitstabelle durchführt, wenn wrk.cre_surr_id der Primärschlüssel ist. Die Statistiken auf beiden Tabellen sind beide auf dem neuesten Stand und sind die Indizes für beide Tabellen.Oracle SQL-Abfrage läuft langsam, vollständige Tabelle Scan auf Primärschlüssel, warum?
TABLE INDEXES
WORKS
INDEX NAME UNIQUE LOGGING COLUMN NAME ORDER
WRK_I1 N NO LOGICALLY_DELETED_Y Asc
WRK_ICE_WRK_KEY N YES ICE_WRK_KEY Asc
WRK_PK Y NO CRE_SURR_ID Asc
WRK_TUNECODE_UK Y NO TUNECODE Asc
TLE_TITLE_TOKENS
INDEX NAME UNIQUE LOGGING COLUMN NAME ORDER
TTT_I1 N YES TOKEN_TYPE, Asc
SEARCH_TOKEN,
DN_WRK_CRE_SURR_ID
TTT_TLE_FK_1 N YES TLE_SURR_ID
Problem Abfrage unten. Es hat einen Preis von 245.876, was hoch erscheint, es macht einen vollständigen Tabellenscan der Tabelle WORKS, die 21.938.384 Zeilen in der Tabelle hat. Es führt einen INDEX RANGE SCAN der Tabelle TLE_TITLE_TOKENS durch, die 19.923.002 Zeilen enthält. Auf dem Erklärungs-Plan ist auch ein INLIST ITERATOR, von dem ich keine Ahnung habe, was es bedeutet, aber ich denke, es hat damit zu tun, dass ich ein "in ('E', 'N')" in meiner SQL-Abfrage habe.
SELECT wrk.cre_surr_id
FROM works wrk,
tle_title_tokens ttt
WHERE ttt.dn_wrk_cre_surr_id = wrk.cre_surr_id
AND wrk.logically_deleted_y IS NULL
AND ttt.token_type in ('E','N')
AND ttt.search_token LIKE 'BELIEVE'||'%'
Wenn ich die Abfrage nach unten und machen eine einfache wählen Sie aus der TLE_TITLE_TOKENS Tabelle brechen erhalte ich 280.000 Datensätze zurück.
select ttt.dn_wrk_cre_surr_id
from tle_title_tokens ttt
where ttt.token_type in ('E','N')
and ttt.search_token LIKE 'BELIEVE'||'%'
Wie höre ich es auf, wenn ich einen FULL TABLE-Scan in der WORKS-Tabelle durchführe. Ich könnte einen Hinweis auf die Frage geben, aber ich hätte gedacht, dass Oracle clever genug wäre, um den Index ohne einen Hinweis zu verwenden.
Auch in der Tabelle TLE_TITLE_TOKENS wäre es besser, einen funktionsbasierten Index für die Spalte SEARCH_TOKEN zu erstellen, da Benutzer LIKE% in diesem Feld suchen. Wie würde dieser auf Funktionen basierende Index aussehen?
Ich bin auf einer Oracle 11g-Datenbank ausgeführt.
Vielen Dank im Voraus für alle Antworten.
Wie viele Zeilen gibt die Abfrage zurück? – Thilo
Hilft ein zusammengesetzter Index für cre_surr_id und logically_deleted_y? – Thilo
Versuchen Sie, explainplan für Ihre Abfrage zu verwenden, um das Problem in Ihrer Abfrage zu identifizieren. Überprüfen Sie https://docs.oracle.com/cd/B19306_01/server.102/b14211/ex_plan.htm#g42231 – Phoenician