Co jest lepszego w klauzuli WHERE
?SQL GDZIE na dużym stole -> Najpierw dołącz do małego stołu lub umieść FK bezpośrednio w klauzuli WHERE?
Mam duży stół, z FK do małego stolika. Mogę przeszukiwać FK bezpośrednio lub mogę dołączyć do tabeli FK i ustawić ograniczenie WHERE
dla połączonej tabeli. Co jest lepsze/lepsze?
Więc tak:
SELECT lt.* FROM LargeTable lt
WHERE lt.SomeId in(12,55)
Albo to:
SELECT lt.* FROM LargeTable lt
INNER JOIN SmallTable st ON lt.SomeId=st.ItemId
WHERE st.Id in(12,55)
testowałem to z Set statistics time on
, ale nie spodziewałem się tego wyniku. Kto może wyjaśnić, co się tutaj dzieje?
Pierwszy test bez dołączyć:
(946 row(s) affected)
SQL Server Execution Times:
CPU time = 1544 ms, elapsed time = 1580 ms.
drugie badanie z przyłączyć
(946 row(s) affected)
SQL Server Execution Times:
CPU time = 2636 ms, elapsed time = 366 ms.
EDIT: Kiedy zrobić SELECT Id
zamiast SELECT *
, następnie pierwsze zapytanie bez dołączyć ma niższą upływającego czasu, a koszt kwerendy w planie wykonania wynosi 25% dla braku łączenia kontra 75% dla zapytania z łączeniem.
jest 'lt.Id' indeksowane? – RedFilter
Powinieneś dołączyć rzeczywisty plan wykonania, a następnie uruchomić oba zapytania obok siebie ... SQL Server powie Ci, który z nich jest szybszy i dlaczego jest szybszy. –
+1 za rzeczywisty plan wykonania. Nie musisz zgadywać. –