Mam SP z parametrem, który ma wartość NULL jako wartość domyślną, a następnie chcę wykonać takie zapytanie:
SELECT ...
FROM ...
WHERE a.Blah = @Blah AND (a.VersionId = @VersionId OR (@VersionId IS NULL AND a.VersionId IS NULL));
Na WHERE
powyższe kontrole zarówno dla wartości niezerowe i wartości null @VersionId
.
Czy pod względem wydajności lepiej byłoby użyć IF
instrukcji i zduplikować zapytanie na takie, które wyszukuje wartości inne niż NULL, a inne takie jak NULL? :
IF @VersionId IS NULL BEGIN
SELECT ...
FROM ...
WHERE a.Blah = @Blah AND a.VersionId IS NULL;
ELSE BEGIN
SELECT ...
FROM ...
WHERE a.Blah = @Blah AND a.VersionId = @VersionId;
END
Czy optymalizator zapytań sprawia, że jest on zasadniczo taki sam?
AKTUALIZACJA:
(Uwaga: używam programu SQL Server)
(I o ile wiem, używanie a.VersionId = @VersionId
w obu przypadkach nie będzie działać, prawda?)
sql-server-2008
performance
użytkownik2173353
źródło
źródło
Odpowiedzi:
Ten wzór
można zastąpić
Umożliwi to dopasowanie wartości NULL do NULL i pozwoli silnikowi na
column
efektywne wykorzystanie indeksu . Aby uzyskać doskonałą dogłębną analizę tej techniki, odsyłam do artykułu na blogu Paula White'a:Ponieważ w twoim przypadku istnieją dwa argumenty, możesz użyć tej samej techniki dopasowywania
@Blah
- w ten sposób będziesz mógł napisać mniej więcej zwięźle całą klauzulę WHERE:Będzie działać szybko z włączonym indeksem
(a.Blah, a.VersionId)
.W takim przypadku tak. We wszystkich wersjach (przynajmniej) począwszy od SQL Server 2005 optymalizator rozpoznaje wzorzec
col = @var OR (@var IS NULL AND col IS NULL)
i zastąpić go odpowiednimIS
porównaniem. Polega to na wewnętrznym dopasowaniu przepisywania, więc mogą być bardziej złożone przypadki, w których nie zawsze jest to niezawodne.W wersjach SQL Server od 2008 SP1 CU5 włącznie , masz również opcję użycia Optymalizacji osadzania parametrów za pośrednictwem
OPTION (RECOMPILE)
, gdzie wartość czasu wykonania dowolnego parametru lub zmiennej jest osadzona w zapytaniu jako literał przed kompilacją.Tak więc, przynajmniej w dużym stopniu, w tym przypadku wybór jest kwestią stylu, choć
INTERSECT
konstrukcja jest niewątpliwie kompaktowa i elegancka.Poniższe przykłady przedstawiają „ten sam” plan wykonania dla każdej odmiany (z wyłączeniem literałów i odniesień do zmiennych):
źródło