2013-12-18 2 views
6

Ich habe einfache Abfrage:SQL keine Daten IN-Anweisung nicht mit dem Index abgerufen

SELECT * FROM MH.APPOINTMENT WHERE DOCTOR_INC_ID = 1391791151 

Wenn ich den Ausführungsplan prüfen, wie ich sehe, dass die Daten-Index unter Verwendung abgerufen

jedoch die folgende Abfrage:

SELECT * FROM MH.APPOINTMENT WHERE DOCTOR_INC_ID NOT IN (1391791151) 

nicht aus unserem Index profitieren. Wir verwenden Oracle 11g Release2. Irgendwelche Vorschläge sind willkommen. Danke

+0

Welche RDBMS verwenden Sie? Die Antwort hängt davon ab. –

+0

Oracle 11 g Version 2 – cgon

Antwort

7

Es wird einfach nicht zahlen Index für diese Art von Abfrage zu verwenden - es ist nicht selektiv genug. Wenn erwartet wird, dass die Abfrage eine Zeile (oder eine kleine Anzahl von Zeilen im Vergleich zur Tabellengröße, z. B. 1%) abruft, können Sie die Werte sehr schnell finden, indem Sie zunächst einen Index durchsuchen und dann die zugehörigen Zeilen aus dem tatsächlichen Wert zurückgeben Tabelle. Wenn die Abfrage jedoch 99% der Zeilen zurückgibt, ist es nicht sinnvoll, nach ihnen in einem IDEX zu suchen und dann die zugehörigen Zeilen abzurufen - das ist zu viel Arbeit. Stattdessen geht der Motor direkt zum Tabellenscan.

+0

Es kann anders aussehen, wenn Sie einen Bitmap-Index verwenden. Sie sind jedoch nur sinnvoll, wenn die Werte ** nicht ** selektiv sind –

15

Wenn Sie in den USA leben und nach "New York" und "Washington" fragen, werden Sie den Standort leicht identifizieren können. Weil sie auf Ihr Gedächtnis indexiert sind. Wenn Sie nach allen Städten außer "New York" gefragt werden, müssen Sie immer noch alle Städte aus Ihrem Gedächtnis holen, was natürlich nicht so einfach ist wie vorher !!!

Kann ich klingen lustig, aber das ist das Konzept der Index-Scan und vollständige Tabelle Scan.

+0

+1 für gute Erklärung – MinhD

+0

wirklich schönes Beispiel ... – SriniV

Verwandte Themen