Oracle verwendet beim Verbinden keinen Index

8

Ich bin sehr neu, um Pläne zu indexieren und zu erklären, also bitte, ertragen Sie mit mir! Ich versuche eine Abfrage zu tunen, aber ich habe Probleme.

Ich habe zwei Tabellen:

%Vor%

Wenn ich ein select * from SKU where clridx = 122 mache, kann ich sehen, dass es den Index im EXPLAIN-Plan benutzt (es sagt TABLE ACCESS .. INDEX, es sagt den Indexnamen unter OBJECT_NAME und die Optionen sind RANGE SCAN).

Wenn ich nun versuche, auf dem gleichen Feld zu erscheinen, scheint es nicht den Index zu benutzen (es sagt TABLE ACCESS .. HASH JOIN und unter Optionen, es sagt FULL).

Worauf sollte ich achten, um zu sehen, warum der Index nicht verwendet wird? Entschuldigung, ich bin mir nicht sicher, welche Befehle eingegeben werden müssen, um dies anzuzeigen. Bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen.

Beispiele:
1. Abfrage:

%Vor%

2. Abfrage:

%Vor%

3. Abfrage:

%Vor%

    
Lock 16.07.2013, 00:53
quelle

2 Antworten

17

Sehen Sie sich diese Abfrage an:

%Vor%

Es hat keine zusätzlichen Prädikate. Sie fügen also alle Zeilen in SKU allen Zeilen in IMPCOST_CLR hinzu. Außerdem wählen Sie alle Spalten aus beiden Tabellen aus.

Dies bedeutet, dass Oracle die Gesamtheit beider Tabellen lesen muss. Der effizienteste Weg hierfür ist die Verwendung des vollständigen Tabellenscan, um alle Zeilen in Lesevorgängen mit mehreren Blöcken zu durchsuchen und Hashing zu verwenden, um die Werte des Joins abzugleichen.

Im Grunde genommen handelt es sich um eine set-Operation, was SQL sehr gut macht, während indexierte Reads mehr

zu enthalten %Vor%

Der Zugriffspfad wird höchstwahrscheinlich auf INDEX RANGE SCAN zurückgesetzt. Da Sie nur eine vergleichende Handvoll von Zeilen auswählen, ist der indexierte Lesevorgang wieder der effizientere Pfad.

  

"Die Abfrage, die ich zu tun versuche, ist hunderte von viel länger, aber brechen   es runter und es Schritt für Schritt! "

Dies ist eine gute Technik, aber Sie müssen verstehen, wie der Oracle Optimizer funktioniert. In Explain Plan finden Sie viele Informationen. Erfahren Sie mehr. Achten Sie darauf auf den Wert in der Spalte Rows für jeden Schritt. Damit erfahren Sie, wie viele Zeilen der Optimierer von der Operation erwartet. Sie werden sehr unterschiedliche Werte für die ersten beiden Abfragen im Vergleich zum dritten sehen.

    
APC 16.07.2013, 01:31
quelle
5
  

Wenn ich jetzt versuche, auf demselben Feld zu erscheinen, wird es nicht angezeigt   Um den Index zu verwenden (es sagt TABLE ACCESS .. HASH JOIN und unter   Optionen, es sagt FULL).

Dies liegt daran, dass HASH JOIN keine Indizes für die Join-Prädikate benötigt (benötigt):

Ссылка

    
Markus Winand 16.07.2013 05:57
quelle