2013-01-08 25 views
10

Ben 13 LEFT OUTER JOINS kullanmadığım bir sorgu var. Soldaki tabloda büyük bir veri var, bu nedenle sorguyu yürütmek ve sonucu döndürmek için çok uzun zaman alır. Ancak sonucu filtrelemek için bir where cümlesi kullandığımda, çok daha az zaman alır. Şimdi hangisinin daha önce yürütüldüğü konusunda kafam karıştı: sonuç üreten birleşim ve bundan sonra filtrenin filtrelenmesi VEYA önce sonuçları filtreleyerek sonucun birleşimini alır.ilk olarak çalışır: birleştirir veya yan tümce

+3

sunucu işini daha kolay yapabilir böylece bakılmaksızın SQL Server'ın sorgu iyileştirici etrafında adımlarınızı karıştırmak için nasıl seçtiğine dair, yapabileceğiniz en iyi şey düzgün verileri korumak ve dizin oluşturduğunu unutmayın. –

+1

Bakimli "STATISTICS" de yardımcı olur. – MarkD

+0

Eğer wnat bilgi var eğer kabul ve kabul olarak işaretlemek için unutma –

cevap

10

Genellikle, herhangi bir DBMS (SQL gibi) en hızlı olduğunu düşündüğü algoritmayı kullanan kendi sorgu optimizasyonunu yapar. Yani filtreliyor, sonra katılıyor.

2

Okuma: which one runs first in query execution WHERE CLAUSE orJOIN CLAUSE ?

ve

Ben Pinal Dave sonrası Reding ediyorum ve bunu buldum, bunu anlamak için yardıma talso migh

SQL SERVER – Interesting Observation of ON Clause on LEFT JOIN – How ON Clause affects Resultset in LEFT JOIN

enter image description here

enter image description here

ON yan tümcesini anlamanız JOIN'den önce geçerlidir, bu nedenle Tablo 2'nin olduğu Tablo2'nin tüm sonuçlarını alması nedenidir, ancak Tablo1'i etkilemez, bu nedenle tablonun tüm satırlarını alır1. WHERE yan tümcesi uygulandığında, tam sonuç için geçerlidir, bu nedenle Çizelge 1 ve Tablo 2'den Tablo1 ve Tablo2'den = 1 satır tutulduğu Bayrak1 ve Çizelge 2'deki tüm satırları kaldırır.

2

Copied from my previous answer

create table A(id int); 
create table B(id int); 

INSERT INTO A VALUES(1); 
INSERT INTO A VALUES(2); 
INSERT INTO A VALUES(3); 

INSERT INTO B VALUES(1); 
INSERT INTO B VALUES(2); 
INSERT INTO B VALUES(3); 

SELECT * FROM A; 
SELECT * FROM B; 

id 
----------- 
1 
2 
3 

id 
----------- 
1 
2 
3 

Filtre artır işlemi sırasında ilave edilen satır önlemek için artır. JOIN meydana geldikten sonra filtreleyecektir.

select a.*,b.* 
from A a left join B b 
on  a.id =b.id 
where a.id=2; 

id   id 
----------- ----------- 
2   2 
İlgili konular