Ginge sowas?
SQL-Code:
select * from tabelle where id = ((:condition and (id = 1))
union all
select * from tabelle where id = (not :condition and (id = 20))
Zitat von
lxo:
Warum macht Firebird bei der verschachtelten Bedingung 604 reads und nicht 314?
Meiner Meinung nach ist das korrekt so wie es ist:
Code:
1. Wherebedingung
-- 314 indizierte reads auf die Tabelle
T.ID = 1
Code:
2. Wherebedingung
-- 290 indizierte reads auf die Tabelle
T.ID= 20
314 Reads + 290 Reads = 604 Reads
Code:
3. Wherebedingung -> Reads = Summe der Reads aus Wherebedingung 1 und Wherebedingung 2.
-- 604 indizierte reads auf die Tabelle
( ( TRUE and
( T.ID = 1)) or
( not TRUE and
( T.ID= 20)))
Firebird arbeitet hier praktisch die beiden Wherebedingungen ab und fügt deren Ergebnisse zusammen. Der Aufwand für die Datenbank für das Ausführen der kombinierten Wherebedingung ist genauso hoch wie der Aufwand für das Ausführen der einzelnen Bedingungen. Die Reads sind wohl eher abhängig von der Datenmenge, vermutlich gibt es mehr Sätze mit ID = 1 als mit ID = 20 und deshalb unterscheiden sich die Reads. Bei geänderten Datenverhältnissen kann sich das dann auch mal verschieben.
Mein Gedanke war aber wenn die zweite Bedingung eh schon false ist, wozu wird da noch was gelesen. Die könnte er ja eigentlich ignorieren.
Macht der ja auch wenn ich iif mache, aber nur mit konstanten Werten.