2010-07-22 11 views
6
select * 
from ContactInformation c 
where exists (select * from Department d where d.Id = c.DepartmentId) 

select * 
from ContactInformation c 
inner join Department d on c.DepartmentId = d.Id 

Oba zapytania dać taką samą moc, co jest dobre w wydajności mądry przyłączyć lub skorelowane z kwerendy sub istnieje zapis, który z nich jest lepszy.JOIN lub podzapytanie skorelowane ze istnieje zapis, który z nich jest lepszy

Edit: -jest tam AlterNet sposób łączy, tak aby zwiększyć wydajność: - W powyższych 2 zapytaniami chcę info z dept jak również tabele contactinformation

Odpowiedz

5

Generalnie klauzula EXISTS ponieważ może trzeba DISTINCT dla JOIN na to, aby dać oczekiwany wynik. Na przykład, jeśli masz wiele Department wiersze Przez ContactInformation rzędu.

W przykładzie powyżej, SELECT *:

  • oznacza innego wyjścia zbyt więc nie są one rzeczywiście równoważne
  • mniejsza szansa na indeks używana, ponieważ jesteś wyciągając wszystkie kolumny z

Mówiąc, że nawet z ograniczoną listą kolumn, dadzą taki sam plan: aż będziesz potrzebować DISTINCT ... i dlatego mówię "EXISTS"

+0

świetnie ... to. – hrishi

+0

Edycja: -jest alternatywą dla łączenia, aby zwiększyć wydajność: - W powyższych 2 zapytaniach chcę informacji z dept, jak również tabel danych kontaktowych – hrishi

4

trzeba mierzyć i porównywać - nie ma złota zasada, która będzie lepsza - zależy od zbyt wielu zmiennych i rzeczy w twoim systemie.

W SQL Server Management Studio można umieścić oba zapytania w oknie, wybierz opcję Include actual execution plan z menu Zapytanie, a następnie uruchom je razem.

alt text http://i31.tinypic.com/2rw48s2.png

Powinieneś dostać porównanie obu swoich planach wykonanie i odsetek, ile czasu spędził na jedną lub drugą zapytania. Najprawdopodobniej oba będą blisko 50% w tym przypadku. Jeśli nie, to wiesz, które z tych dwóch zapytań działa lepiej.

Możesz dowiedzieć się więcej o planach realizacji SQL Server (a nawet pobrać darmowy e-book) od Simple-Talk - wysoce zalecana.

1

Pierwsze zapytanie powinno zawierać kolumny działu, a drugie nie.

Jeśli jesteś zainteresowany tylko w ContactInformation, te pytania są równoważne. Można je uruchomić i sprawdzić plan wykonania kwerendy, aby sprawdzić, który z nich działa szybciej. Na przykład, MySQL, where exists jest bardziej efektywne z pustych kolumn, natomiast inner join działa lepiej, jeżeli żadna kolumna jest pustych.

2

Zakładam, że chcesz dodać słowo kluczowe DISTINCT do klauzuli SELECT w drugim zapytaniu (lub, co mniej prawdopodobne, Departament ma tylko jeden Kontakt).

Po pierwsze, zawsze zaczynają się od rozważań „logicznych”. Konstrukcja EXISTS jest prawdopodobnie bardziej intuicyjna, więc wszystkie rzeczy "fizyczne" byłyby sobie równe.

Po drugie, będzie jeden dzień, w którym trzeba będzie przelać ten kod, niekoniecznie do innego produktu SQL, ale powiedzmy, do tego samego produktu, ale z innym optymalizatorem. Przyzwoity optymalizator powinien rozpoznać, że oba są równoważne i wymyślić ten sam idealny plan.Weź pod uwagę, że teoretycznie konstrukcja EXISTS ma nieco większy potencjał do zwarcia.

Po trzecie, przetestuj go, używając dość dużego zestawu danych. Jeśli wydajność nie jest akceptowalna, zacznij od rozważenia "fizycznych" uwarunkowań (ale sugeruję, aby zawsze przechowywać swój "logicznie czysty" kod w komentarzach na nadchodzący dzień, gdy nadejdzie idealny optymalizator;)

Powiązane problemy