2010-12-10 76 views
0

我正在使用Entity Framework和Linq to Entities以及MySQL ADO.Net連接器來訪問MySQL數據庫。這兩個SQL查詢中哪一個更高效?

有兩個表請求和提交與從請求到提交的一對多關係。因此,提交表包含RequestId列,該列對請求具有外鍵依賴性。

我需要檢索其提交中包含特定值的所有請求。在LINQ我能做到這一點的兩種方法之一:

var r1 = foo.Submissions.Where(s => s.FieldName == "foo" && s.FieldValue == "bar").Select(s => s.Request).Distinct(); 
var r2 = foo.Requests.Where(r => r.Submissions.Any(s => s.FieldName == "foo" && s.FieldValue == "bar")); 

計算結果爲

SELECT `Distinct1`.* 
FROM 
    (SELECT DISTINCT `Extent2`.* 
    FROM `Submissions` AS `Extent1` INNER JOIN `Requests` AS `Extent2` ON `Extent1`.`RequestId` = `Extent2`.`RequestId` 
    WHERE ("foo" = `Extent1`.`FieldName`) AND ("bar" = `Extent1`.`FieldValue`)) 
AS `Distinct1` 

SELECT `Extent1`.* 
FROM `Requests` AS `Extent1` 
WHERE EXISTS 
    (SELECT 1 AS `C1` 
    FROM `Submissions` AS `Extent2` 
    WHERE (`Extent1`.`RequestId` = `Extent2`.`RequestId`) AND ((@gp1 = `Extent2`.`FieldName`) AND (@gp2 = `Extent2`.`FieldValue`))) 

現在查詢的第一樣式使用的INNER JOIN ...是不是第二選擇現在效率較低?

回答

3

您應該能夠通過查看爲SSMS中的兩個查詢生成的查詢計劃來自己確定。特別注意任何正在完成的掃描而不是搜索。

然後,您可以在SQL事件探查器中分析這兩個查詢,以查看哪些產生較少的總體讀取,並消耗較少的CPU週期。

+0

啊,但我使用MySQL作爲數據庫,這些工具可以工作嗎? – puffpio 2010-12-11 07:47:32

+0

我嘗試過在MySQL中使用EXPLAIN關鍵字,但它不如SQL Profiler – puffpio 2010-12-11 07:47:58

+1

@puffpio - 如果您使用MySql,爲什麼您的問題有TSQL標記? – 2010-12-11 11:03:03

0

第一種方法可能涉及一種排序(獨特),這表明當每個請求的提交次數很大時,EXISTS替代方案會更好地執行。

掛鐘告訴你什麼?

+0

hehe我還沒有填寫足夠的數據庫有所作爲,但我想選擇編寫LINQ查詢來生成高效的SQL – puffpio 2010-12-11 07:47:13

+0

大多數請求沒有提交,但是當他們做了......他們將有5-20 ...給你一個想法,有大約4000000個請求和50000個提交 – puffpio 2010-12-11 08:12:57