2012-03-13 30 views
-1

我需要有選擇地檢索具有1對多關係的兩個表中的數據。一個簡單的例子如下。從2個表中檢索具有1對多關係的數據 - 使用1個查詢或2個更有效?

表A是事件的列表:

Id | TimeStamp | EventTypeId 
-------------------------------- 
1 | 10:26... | 12 
2 | 11:31... | 13 
3 | 14:56... | 12 

表B爲事件屬性的列表。不同的事件類型具有不同數量的屬性。有些事件類型有沒有屬性可言:

EventId | Property | Value 
------------------------------ 
1  | 1  | dog 
1  | 2  | cat 
3  | 1  | mazda 
3  | 2  | honda 
3  | 3  | toyota 

有一些條件,我會申請,當我檢索數據,但是它們都圍繞着桌子A.舉例來說,我可能要在一個只有事件某一天,或者只有某種類型的事件。

我相信我有檢索數據的兩個選項:

選項1
執行兩個查詢:首次查詢表A(用WHERE子句中)和存儲數據的地方,然後查詢表B(加盟在表A中,以便使用相同的WHERE子句)和「填入空白」中的數據,我從表A檢索到的數據。

此選項要求SQL Server通過表A執行2次搜索,但是生成的2個數據集不包含重複的數據。

選項2
執行單個查詢,與左接合表A至表乙JOIN。

此選項只需要對錶A進行一次搜索,但生成的數據集將包含許多重複的值。

結論
是否有一個「正確」的方式做到這一點還是需要嘗試兩種方式,看看哪一個更快?

回答

0

防爆

Select E.Id,E.Name from Employee E join Dept D on E.DeptId=D.Id 

和子查詢是這樣的 -

Select E.Id,E.Name from Employee Where DeptId in (Select Id from Dept) 

當我考慮性能這兩個查詢的速度會更快,爲什麼?

會預計第一個查詢更快,主要是因爲您有等價和顯式JOIN。根據我的經驗,IN是一個非常慢的運算符,因爲SQL通常將其評估爲由「OR」(WHERE x = Y OR x = Z OR ...)分隔的一系列WHERE子句。

與所有這些SQL雖然,你的里程可能會有所不同。速度將取決於很多索引(你是否在兩個ID列上都有索引?這將有助於很多...)等等。

以更快的速度告訴100%確定性的唯一真正方法是開啓性能跟蹤(IO統計特別有用)並同時運行它們。確保在運行之間清除緩存!

更多REF

相關問題