Wie kann ich vermeiden, IS [not] NULL in einer SQL-select-Anweisung?
IS [NOT] NULL
mischt sich mit den Indizes von SQL-Anweisungen in Oracle gibt es eine Möglichkeit, die ich ersetzen können IS NULL
in einer SQL-Anweisung?
Laut Oracle 9i-Performance Tuning-Tipps und Techniken, mit IS [not] NULL unterdrückt die Indizes der Spalten.
Beispiel:
select * from users where user_id is not null;
- Was sind die Gründe, warum Sie down sind diese Abstimmung?
- Ich habe nicht nach unten abzustimmen, aber der Titel und die Frage selbst grammatische Fehler, die bedeutet, dass er nicht sehr gut Lesen.
- Nicht Stimme. Ich werde versuchen zu zeigen, was unklar ist, mit dieser Frage. Was meinst du mit "mischt sich mit den Indizes"? Versuchen Sie, mehr details, fügen Sie ein Beispiel, das problem erklären...
- danke, lassen Sie mich schnell tun.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es keinen effizienten Weg, das gleiche zu tun, ohne die Daten zu verändern.
Können Sie mit einem Magie-Wert anstelle der null ist, z.B. -1. Das würde Ihnen ermöglichen, stellen Sie das Feld nicht auf null gesetzt werden, die Leistung erhöht sich etwas, und arbeitet besser mit Indizes. Dies widerspricht jedoch der üblichen Empfehlung zu vermeiden Magie Werte, es ist also ein Kompromiss zwischen performance und best practice.
field IS NULL
? Aus PostgreSQL, wo ich bin mit diesen Ausdruck für die Indizierung IST NULL, und seit 9.0 nutzt Indizes IST NICHT NULL standardmäßig, es scheint komisch zu mir, dass "die mächtigen" Oracle wird nicht zulassen, zu verwenden, Indizes NULL IST.Für
IS NOT NULL
Ihren Anspruch nicht wahr. Oracle wird Verwendung eines index auf die Spalte (sofern ein index-scan ist in der Tat schneller als ein full table scan, was nicht immer der Fall ist)Oracle nicht Tupel, die sind alle NULL in einen index, dafür, wenn Sie definieren eines index für eine einzelne Spalte z.B.
CREATE INDEX idx_user_id ON person (user_id)
im index nicht enthalten Zeilen, in denen user_id is NULL. Als Ergebnis, dass der index nicht verwendet werden kann für eineIS NULL
Zustand.Jedoch können Sie eine Problemumgehung, wenn Sie tun müssen, häufige
IS NULL
Auswahl, von zwingen, die null-Werte indiziert werden, mit einer Konstante in der index-definition:CREATE INDEX idx_user_id ON person (user_id, 1)
. Diesen index verwendet, der für eine NULL-Zustand (wieder andere access-Methoden nicht mehr effizient).Sind Sie erlaubt, ändern Sie die db-Struktur?
Wenn ja, um keine
WHERE column IS NULL
oderWHERE column IS NOT NULL
Bedingung in Abfragen, dann vollständig normalisieren Ihre Tabellen (d.h. 5NF oder 6NF) und alle Spalten, die in BedingungenNOT NULL
.Ich bin kein Oracle-Experte, aber ich bezweifle ernsthaft, dass eine ernsthafte RDBMS wie Oracle nicht mit index auf eine null-Spalte. Sehen diese Frage und Antworten unterstützen diese Meinung. Vielleicht sind die Probleme (Sie denken) Sie sind nicht verursacht durch die
NULL
s in Ihrer Spalte, sondern durch die Selektivität von Ihnen: oracle-10g-optimieren-wo-ist-nicht-nullFür Ihre einfache Abfrage:
der Optimierer entscheiden, nicht zu verwenden, wird der index - wie für jede andere Abfrage - wenn die Selektivität ist nicht hoch genug. Wenn die Nullen werden nur wenige auf die Tabelle, dann vollständig Scannen der Tabelle wird schneller sein - oder zumindest den Optimierer, der so denkt.
NOT NULL
in SQL-DDL-aber warum willst du gleichsetzen dieser mit Normalisierung? Wenn Sie behaupten, dass der null-Wert hat keinen Platz in das relationale Modell und verletzt daher 1NF, dann würde ich auch wieder Zustimmen. Aber ich vermute eher, dass Sie hatte etwas anderes im Sinn, als was Ihre "normalisieren Sie Ihre Tabellen" Ratschläge, aber was ist das bitte?IS NULL
undIS NOT NULL
in Oracle.