2009-07-13 10 views
6

W T-SQL, co jest szybsze?Co jest szybciej w IN lub OR?

DELETE * FROM ... WHERE A IN (x,y,z) 

Albo

DELETE * FROM ... WHERE A = x OR A = y OR A = z 

w moim przypadku X, Y i Z mają wejściowe parametry procedury przechowywanej. Próbuję uzyskać wydajność moich instrukcji DELETE i INSERT najlepiej jak potrafię.

Odpowiedz

11

"IN" zostanie przetłumaczone na serię "OR" s ... jeśli spojrzysz na plan wykonania zapytania z "IN", zobaczysz, że go rozwinął.

Znacznie czystsze w użyciu "IN", moim zdaniem, zwłaszcza w przypadku większych zapytań, sprawia, że ​​jest on bardziej czytelny.

+0

Thnx, w planie wykonania zobaczyłem, że kosztowałoby dokładnie tyle samo czasu procesora. – Zyphrax

+0

To nie jest prawda. In nie jest przetłumaczone jako serise ors. Najlepiej będzie profilować zapytanie i zobaczyć rezultat. Najczęściej EXISTS jest szybsze niż IN. Ale OR * powinno * być szybsze niż oba. Zależy jednak od indeksów. –

+0

@Frank, mówimy o INs z listami wartości, a nie IN z podzapytaniami. –

0

Musi być dokładnie taki sam. Większość RDMBS transalte IN do ORs.

Oczywiście, jeśli wziąć pod uwagę tłumaczenie z INs do ORs być wysoka czasochłonne zdanie z ORs jest szybszy ;-)

Aktualizacja: Zastanawiam że A jest kolumną.

1

Jeśli obliczenie to A, zostanie wykonane raz przy użyciu IN i N razy przy użyciu OR.

14

Nie myśl; profil.

Zachęcam, aby nie polegać na intuicji, własnej lub kogokolwiek innego, rozważając kwestie prędkości. Zamiast tego spróbuj obu opcji, z pewnym pomiarem profilowania/wykonywania, i dowiedzieć się, który jest szybszy w twoich okolicznościach.

+1

+1 Dziękuję za kopię zapasową tego, co sam próbuję powiedzieć. :-) –

4

Napisz dwie zapisane procedury, jedną używając IN, drugą używając OR, na serwerze testowym. Uruchom każdą procedurę o 10 000 (lub 1 000 000 lub cokolwiek) razy i porównaj czasy.

Ogólnie jest to "jedyny" sposób na uzyskanie dobrej odpowiedzi na pytanie, które podejście jest szybsze: pisz proste przypadki testowania czasu i uruchamiaj je wiele, wiele razy.

3

W SQL Server optymalizator wygeneruje identyczne plany dla tych zapytań.

2

powinny generować dokładnie taki sam plan, z mojego doświadczenia

spojrzeć na plan

1

Niezależnie od tego, czy A jest obliczenie lub kolumna, wygląda jak SQL Server 2005 konwertuje IN lub klauzule .

+0

Może również przekonwertować go na join, w przypadku, gdy zawartość IN jest wynikiem innej instrukcji SELECT. –

1

Bezwzględnie najszybszy z SQL Server jest użycie DELETE z INNER JOIN. Przy trzech wartościach nie zauważysz różnicy, ale przy większej wartości (robimy kilka tysięcy) różnica jest fenomenalna. Możesz ukryć swoje wartości w tabeli tymczasowej, a następnie dołączyć do tego.

E.g.

DELETE C 
FROM Customer AS C INNER JOIN #ValuesToDelete AS D ON C.CustID = D.CustID 

Można także dodać opcjonalną klauzulę where.

Powiązane problemy