PDA

Vollständige Version anzeigen : Kriterium -1 oder 1 hat nichts bei Null


KarMulholand
17.01.2008, 14:33
In einer Abfrage bekomm ich kein Ergebnis für dieses Kriterium '<>-1'
Die Spalte ist vom Datentyp Integer (Standardwert 0 ist nicht gesetzt), sie hat bisher keine Einträge. Bei Kritrium 'is Null' werden also alle angezeigt.

Muss ich es denn unbedingt so schreiben <>-1 oder is Null

Anne Berg
17.01.2008, 16:22
Kurz gesagt. Ja. ;)

Oder du setzt die NZ-Funktion ein: NZ(Feld) <> -1
Die wandelt Null in 0 oder "" um, je nach Datentyp.

Josef P.
17.01.2008, 18:25
Oder du setzt die NZ-Funktion ein: NZ(Feld) <> -1
... bitte beim kurzen "ja" und dem "langen" or feld is null bleiben. Access wird es bei passendem Index mit Laufzeitverkürzung bei vielen DS danken. ;)

KarMulholand
21.01.2008, 12:21
Karl dankt

Lanz Rudolf
21.01.2008, 12:32
Hallo
@Josef
Hast Du zu Deiner Aussage Konkrete Test's gemacht ?

Sascha Trowitzsch
21.01.2008, 12:38
Ruedi, da muss man keinen Test machen.
NZ() ist eine VBA-Funktion. Und die muss für jeden Datensatz erst das Ergebnis berechnen, bevor verglichen, gefiltert, sortiert etc. werden kann.
Und damit kann der Query-Plan nicht auf gleiche Weise optimiert werden, wie bei Verzicht auf eine VBA-Expression. Mit der OR/IS NULL-Bedingung kann JET die Datenmenge von vorn herein einschränken. Das geht viel schneller.
(Ok, wirkt sich aber nur bei vielen Datensätzen merklich aus.)

Ciao, Sascha

Josef P.
21.01.2008, 12:47
Sehr gut erkennt man das Verhalten, wenn man den Jet-Showplan betrachtet.
Anm.: bei diesem Beispiel ist aber noch eine weitere Anpassung sinnvoll.
Access freut sich, wenn aus where Feld <> -1 der Ausruck where Feld < -1 OR Feld > -1 wird. (so eine Optimierung macht z.B. der SQL-Server von selbst.)

SELECT * FROM Tabelle
WHERE NZ(Z) <> -1
=>
01) Restrict rows of table Tabelle
by scanning
testing expression "Not NZ(Z)=-1"

SELECT * FROM Tabelle
WHERE NZ(Z) < -1 OR Z > -1
=>
01) Restrict rows of table Tabelle
by scanning
testing expression "Z>-1 Or NZ(Z)<-1"

SELECT * FROM Tabelle
WHERE Z <> -1 OR Z IS NULL
=>
01) Restrict rows of table Tabelle
by scanning
testing expression "Z Is Null Or Not Z=-1"
=> keine Verbesserung, wegen "<> -1"

SELECT * FROM Tabelle
WHERE Z < -1 OR Z > -1 OR Z IS NULL
=>
01) Restrict rows of table Tabelle
using rushmore
for expression "((Z<-1) OR (Z>-1)) OR (Z Is Null)"
=>
jetzt wird Index genutzt.

BTW: das gleiche Verhalten ist bei den immer wieder in diesem Forum lesbaren Datumsvergleichen der Fall.
WHERE DateDiff("d",[Datumsfeld],Date()) > 5
=> table scan
vs.
WHERE Datumsfeld < dateadd("d", date(), -5)
=> Index kann genutzt werden

Lanz Rudolf
21.01.2008, 13:18
Hallo
Sorry hätte natürlich Test's oder Unterlagen Scheiben müssen
Danke Euch Beiden für die Ausführliche Erläuterungen