2011-07-20 6 views
5

Rozważmy następujący scenariusz:Efektywność wykorzystania przypadku, gdy ... IS NOT NULL vs ISNULL/zlewają

  • Istnieją trzy rodzaje podmiotów, powiedzmy Foo, Bar i Baz.
  • Co Foo musi być powiązany z Bar lub Baz, ale nie jednocześnie.

Scenariusz jest już realizowany w następujący sposób:

  • Istnieją trzy tabele: Foo, Bar i Baz.
  • Foo ma dwa pola klucza obcego: Bar_ID i Baz_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 

...?

Odpowiedz

5

Teoretycznie CASE będzie, ponieważ oceniane jest tylko jedno wyrażenie. Kilka łańcuchów ISNULL będzie wymagało przetworzenia.

Jednak trzeba by mieć duży (10000S wierszy) zbiór danych zauważyć żadnej różnicy: większość przetwarzanie przechodzi do rzeczywistego dostępu do tabeli, łączy itp

Czy to próbował? Możesz użyć profilera SQL, aby zobaczyć procesor itp. Dla każdego zapytania.

+0

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

+0

To dobra uwaga. Nie brałem pod uwagę liczby wyrażeń zagnieżdżonych w bloku ISNULL. –

+0

+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

1

Uważam, że ISNULL jest bardziej wydajny. Instrukcje CASE są zawsze oceniane najpierw i uważam, że ograniczają dostępne opcje do optymalizatora zapytań.

Co mówi plan wykonania? Czy to twoje aktualne pytanie?

1

COALESCE jest funkcją ANSI, a ISNULL jest zastrzeżoną funkcją SQL Server.

Różnią się one sposobem obsługi i kilkoma innymi rzeczami, a COALESCE może akceptować więcej niż dwa argumenty.

Dla twojego zadania (dwa argumenty, oba VARCHAR) są równoważne.

Powiązane problemy