2012-01-19 8 views
10

Używam ISNULL w serwerze MS SQl 2008, ponieważ mój stół jest zbyt duży, czy użycie ISNULL może spowodować jakąkolwiek usterkę wydajności?Czy jest jakiś problem z wydajnością podczas używania ISNULL() w SQL Server?

góry dzięki

+4

Nie możesz sprawdzić i zobaczyć? –

+1

Zależy od wielu rzeczy, jak zawsze. Jak z niego korzystasz, gdzie go używasz, jakie jest Twoje zapytanie. Więcej szczegółów może pomóc. – Paddy

+0

@SergioTulentsev Pracuję nad projektem ulepszenia. Dodaliśmy nowe tagi do tbls. To będzie Null. Dane, które są dostępne do opracowania, są tylko nieliczne. Baza danych produkcji jest bardzo duża. Nie mam do niego dostępu. – kbvishnu

Odpowiedz

8

Jeśli trzeba go używać, to wszelkie różnice między ISNULL i alternatywnych, takich jak COALESCE lub sprawy są malutkie. Nie przejmuj się tym

Wszelkie różnice wynikają z sposobu przetwarzania typów danych. COALESCE/CASE może dodawać niejawne konwersje typów danych, podczas gdy ISNULL ma prostsze reguły.

Edit

ISNULL na liście SELECT, aby stłumić null jest trywialne. Głównym zadaniem będzie przetwarzanie wierszy i danych. Dodatkowy ISNULL nie będzie możliwy do zmierzenia: Nie pisz optimise prematurely

+0

czy możesz zobaczyć komentarze – kbvishnu

+1

Jak przy innej odpowiedzi na ten post, funkcja ISNULL ma znacznie inny profil wydajności, gdy używane w SELECT vs w przypadku użycia w klauzuli WHERE lub JOIN. Moje doświadczenie potwierdza, że ​​tak właśnie jest. –

+0

@DavidAlpert Zgoda. Łatwo jest nadużywać – gbn

9

Tak, może. Dla Optimizer jest lepiej przepisać zapytanie (jeśli to możliwe), aby utworzyć

(Field = @x OR @x IS NULL) 

Ponieważ przy użyciu funkcji w niektórych przypadkach uniemożliwia optymalizator do wykorzystywania danych statystycznych i czasami zmuszony niejawne konwersje dataType

+0

może u pls c d komentarze – kbvishnu

+0

moje zapytanie: - wybierz oldcol, isnull (newcol, 0) "a" z tbl. Więc tutaj używam ISNULL. Czy możesz wyjaśnić trochę na podstawie zapytania. dzięki – kbvishnu

+2

W twoim przypadku efekt użycia ISNULL jest pomijalny. –

0

Jak zostało to już wspomniane to zależy o tym, jak i gdzie używasz go w zapytaniu. Być może zechcesz pokazać sposób, w jaki używasz go w zapytaniu.

Również polecam, aby przejść nad tym - What makes a SQL statement sargable?

35

ISNULL() w klauzuli select ma nikły wpływ na wydajność. W klauzuli where, z drugiej strony, może mieć bardzo duży wpływ na wydajność, ponieważ uniemożliwia optymalizatorowi korzystanie z indeksu w tej kolumnie.

where isnull(col1, 0) = 0 -- unable to use index, because every 
          -- row has to be evaluated 

where col1 = isnull(@myVar, 0) -- index will be used, since isnull(@myVar, 0) 
           -- returns the same static value for every row and 
           -- not every row has to be evaluated by the function. 

Więc podczas korzystania IsNull() w Where-klauzuli ocenić, czy zapobiega optymalizator kwerendy z wykorzystaniem indeksu. Jeśli tak, rozważ utworzenie kolumny obliczeniowej z wynikiem, jeśli isnull (col1, 0) i indeksuj kolumnę obliczoną i użyj jej w swoim miejscu-klauzuli.

+0

Pamiętaj, że te dwa warunki nie dają takich samych wyników. – Atario

1

Unikaj używania isNull w klauzuli where. Patrz This article.

+0

Hej tam - to pytanie ma już zaakceptowaną odpowiedź. To jest dobra informacja, ale byłoby lepiej jako komentarz :) – landons

+0

Nie dostaję tego artykułu. Już patrzy na nagą kolumnę. Isnull (@someVar, 0) nie powinien być drogi. Isnull (someColumn, 0) może być kosztowny, jeśli powoduje, że indeks nie będzie używany. –

+0

Podczas gdy ten link może odpowiedzieć na pytanie, lepiej umieścić w nim istotne części odpowiedzi i podać link do odsyłacza. Odpowiedzi dotyczące linków mogą stać się nieprawidłowe, jeśli strona z linkami się zmieni. - [Z recenzji] (/ opinia/niskiej jakości-posts/18966014) – derloopkat

1

Tak tam jest problem z wydajnością AFAIK, w SQL Server Studio 2012.

Problem jest dość rażący gdy użyłem ISNULL w połączeniu z OVER. Po zoptymalizowaniu (tj. Wstawieniu ISNULL w pod-zapytaniu używam OVER na) czas pracy skrócony z (szacunkowo) 25,2 godziny do 102 sekund.

Domyślam się, że ISNULL jest OK, jeśli uruchomisz go w całej kolumnie (na przykład w zwykłym "SELECT). Ale kiedy uruchomisz go z OVER, jest on nazywane od nowa za każdym razem, co powoduje obniżenie wydajności.

Nie gotowy do dalszego drążenia. Po prostu umieszczam to tutaj dla odniesienia innych osób.

Powiązane problemy