2008-11-04 101 views
3

我在做一些測試和直LINQ到SQL查詢的運行速度比如果通過LINQ查詢存儲過程比LINQ查詢慢嗎?

調用存儲過程在SQL Server Profiler中一個通用的LINQ查詢

var results = from m in _dataContext.Members 
select m; 

了至少快80%只有19毫秒,而不是一個存儲過程

var results = from m in _dataContext.GetMember(userName) 
select m; 

GetMember被存儲的過程)做歷時100毫秒

相同的查詢

這是爲什麼?

編輯:

直LINQ看起來像這樣在探查

SELECT 
    [t1].[MemberID], [t1].[Aspnetusername], [t1].[Aspnetpassword], 
    [t1].[EmailAddr], [t1].[DateCreated], 
    [t1].[Location], [t1].[DaimokuGoal], [t1].[PreviewImageID], 
    [t1].[value] AS [LastDaimoku], 
    [t1].[value2] AS [LastNotefied], 
    [t1].[value3] AS [LastActivityDate], [t1].[IsActivated] 
FROM 
    (SELECT 
     [t0].[MemberID], [t0].[Aspnetusername], [t0].[Aspnetpassword], 
     [t0].[EmailAddr], [t0].[DateCreated], [t0].[Location], 
     [t0].[DaimokuGoal], [t0].[PreviewImageID], 
     [t0].[LastDaimoku] AS [value], [t0].[LastNotefied] AS [value2], 
     [t0].[LastActivityDate] AS [value3], [t0].[IsActivated] 
    FROM 
     [dbo].[Members] AS [t0]) AS [t1] 
WHERE 
    [t1].[EmailAddr] = @p0 

存儲過程是這樣的

SELECT Members.* 
FROM Members 
WHERE dbo.Members.EmailAddr = @Username 

所以你看這個存儲過程的查詢要簡單得多。但是它的速度更慢......對我來說毫無意義。

+0

它看起來不像你的兩個查詢做同樣的事情。第二個參數(大概是爲了限制結果),其中第一個顯然只是獲得所有行。對於初學者,你確定SQL是一樣的嗎? – 2008-11-04 19:21:33

+0

存儲過程中的sql與linq查詢的功能相同...本質上與你是正確的參數...通過linq查詢返回所有行比在存儲過程中返回單個行更快。 – dswatik 2008-11-04 19:23:53

回答

3

1)比較like和like。在兩種情況下執行完全相同的操作,而不是在一種情況下獲取所有值並在另一種情況下執行查詢。

2)不要只執行一次代碼 - 執行很多次,所以優化器有機會工作並避免一次性的命中。

3)使用一個分析器(好的,一個在.NET端,一個在SQL端)來找出性能是實際上不同的地方。

0

在評論中指出,這其中的一部分是你沒有比較蘋果和蘋果。您正試圖比較兩個不同的查詢,從而得到不同的結果。

如果您想嘗試,並確定性能,你會希望比較同一查詢,使用相同的價值觀等

另外,你可以嘗試使用LinqPad能夠看到生成的SQL,以識別潛在的地區導致反應遲緩。

1

有一件事可能會讓它變慢是select *。通常情況下,如果指定了列,則查詢速度會更快。特別是,如果LINQ查詢未在查詢中使用所有可能的列,則它將比select *更快。

1

我忘了,proc也可能有參數嗅探問題。

0

*會延長運行查詢所花費的時間。另外,你在profiler中看到的LINQ的直接SQL是將所有對象名稱括起來([]) - 這將減少LINQ查詢的查詢執行時間的更多時間。

0

我可以添加John Skeet的答案,那就是在幾次運行代碼時,請記住清理任何查詢緩存。

我可以建議在這兩種查詢中使用'EXPLAIN':似乎MySQL爲查詢和SP創建查詢執行計劃的方式不同。對於SP,它在將參數替換爲它們的值之前遵守,因此它不使用索引,在硬編碼或替代參數的情況下使用索引。這裏是來自SO的another question about different run times for SP and straight query以及針對這兩種情況給出的查詢計劃數據。