2014-11-07 14 views
5

Co jest lepsze w poniższych przypadkach.Co jest lepsze wybierz 1 vs wybierz *, aby sprawdzić istnienie rekordu?

1.

IF EXISTS(SELECT * FROM Table WHERE ID = 3) 
BEGIN 
    ------- 
END 

Vs

2.

IF EXISTS(SELECT 1 FROM Table WHERE ID = 3) 
BEGIN 
    ------- 
END 

Albo oba są takie same?

+3

'terminy select' w' exists' podzapytania są ignorowane, co czyni ten wybór to kwestia preferencji. –

+5

To nie ma znaczenia. oba mają taką samą wydajność –

+0

Nigdy nie używam SELECT 1, ponieważ wygląda to brzydko i mówi mi, że programista zbyt dużo uwagi na temat wydajności, nie wiedząc, jak to naprawdę działa. –

Odpowiedz

6

EXISTS sprawdzi, czy w zestawie istnieje jakiś zapis. więc jeśli robisz SELECT z 1 miliona rekordów lub robisz SELECT z 1 rekordu (powiedzmy, używając TOP 1), będą mieli ten sam rezultat i tę samą wydajność, a nawet ten sam plan wykonania. (dlaczego?) Ponieważ istnieje, nie będzie czeka na zakończenie 1 miliona skanów rekordów (lub 1 skanowanie zakończone). Ilekroć znajdzie rekord w zestawie, zwróci wynik jako PRAWDA (Nie ma znaczenia, w tym przypadku używasz * lub nazwa kolumny oba będą miały taki sam wynik wydajności).

USE pubs 
GO 

IF EXISTS(SELECT * FROM dbo.titleauthor) 
PRINT 'a' 

IF EXISTS(SELECT TOP 1 * FROM dbo.titleauthor) 
PRINT 'b' 

poniżej jest plan wykonania dla tych zapytań (jak mam problem, Przekątna, mam przycięte to obraz) enter image description here enter image description here

Ale ten scenariusz i wydajność, a nawet plan wykonania będzie zupełnie zmiana kiedy używasz zapytań następująco (nie wiem, dlaczego należy korzystać z tej strony internetowej!):

USE pubs 
GO 

IF EXISTS(SELECT * FROM dbo.titleauthor) 
PRINT 'a' 

IF EXISTS(SELECT 1) 
PRINT 'b' 

w tym scenariuszu, jak SQL Server nie musi Perfo rm każda operacja skanowania w drugim zapytaniu, wówczas plan wykonania zostanie zmieniony następująco: enter image description here enter image description here

+0

Dziękujemy @Vahid za szczegółowe wyjaśnienie. – Raj

+1

@RajKumar proszę mocno nacisnąć przycisk "Odpowiedź jest przydatna" ;-) –

+1

@ Vahid.Ohh..yeah Zapomniałem. Teraz zrobiłem – Raj

Powiązane problemy