Rozważmy następujący scenariusz:Efektywność wykorzystania przypadku, gdy ... IS NOT NULL vs ISNULL/zlewają
- Istnieją trzy rodzaje podmiotów, powiedzmy
Foo
,Bar
iBaz
. - Co
Foo
musi być powiązany zBar
lubBaz
, ale nie jednocześnie.
Scenariusz jest już realizowany w następujący sposób:
- Istnieją trzy tabele:
Foo
,Bar
iBaz
. Foo
ma dwa pola klucza obcego:Bar_ID
iBaz_ID
.- Dokładnie jedno z tych pól klucza obcego musi być
NULL
.
Teraz chciałbym zbudować kwerendę wyświetlającą listę Foo
s, łącznie z opisem Bar
lub Baz
każdego Foo
jest powiązanego. Właściwie opis Bar
jest dość skomplikowaną formułą pól odpowiedniego wiersza w tabeli Bar
. To samo dotyczy Baz
.
Mój obecny kwerenda wygląda następująco:
SELECT Foo.*,
CASE
WHEN Foo.Bar_ID IS NOT NULL THEN
-- a formula, say...
ISNULL(Bar.LotNumber + '-', '') + Bar.ItemNumber
WHEN Foo.Baz_ID IS NOT NULL THEN
-- another formula, say...
ISNULL(Baz.Color + ' ', '') + Baz.Type
END AS 'Ba?Description'
FROM Foo
LEFT JOIN Bar ON Bar.Bar_ID = Foo.Bar_ID
LEFT JOIN Baz ON Baz.Baz_ID = Foo.Baz_ID
Czy poprzedniego zapytania jest więcej, mniej lub równo wydajny niż ...
SELECT Foo.*,
ISNULL(-- or COALESCE
ISNULL(Bar.LotNumber + '-', '') + Bar.ItemNumber,
ISNULL(Baz.Color + ' ', '') + Baz.Type
) AS 'Ba?Description'
FROM Foo
LEFT JOIN Bar ON Bar.Bar_ID = Foo.Bar_ID
LEFT JOIN Baz ON Baz.Baz_ID = Foo.Baz_ID
...?
Mam prawie żadnych danych do pracy, ale wiem, że będzie to używane w środowisku, w którym ilość danych sprawia, że wydajność jest istotna. – pyon
To dobra uwaga. Nie brałem pod uwagę liczby wyrażeń zagnieżdżonych w bloku ISNULL. –
+1 - Również przetwarzanie "NULL" jest ogólnie dość szybkie, więc zdecydowanie potrzeba dużego zestawu danych, by można było go dostrzec. – JNK