2009-07-01 92 views
7

對於eaxmple,LINQ to SQL的被髮送以下內容:爲什麼LINQ發送sp_executesql而不是直接執行SQL?

exec sp_executesql 
N'SELECT [t0].[HomeID], 
    [t0].[Bedrooms], 
    [t0].[ImageURL], 
    [t0].[Price], 
    [t0].[Available], 
    [t0].[Description] 
FROM 
    [dbo].[Homes] AS [t0] 
WHERE 
    ([t0].[Description] LIKE @p0) AND 
    ([t0].[Available] = @p1) AND 
    ([t0].[Price] >= @p2) AND ([t0].[Price] <= @p3) 
ORDER BY 
    [t0].[Price] DESC', 
N'@p0 nvarchar(4000),@p1 int,@p2 int,@p3 int', 
@p0=N'%private%', 
@p1=1, 
@p2=200000, 
@p3=750000 

爲什麼它使用sp_executesql的?

+0

OP你應該澄清一下你的意思 - 我把它看成是通過SQL Profiler觀看,並看到流動的電話。我將你的問題解釋爲「爲什麼L2S使用sp_executesql而不是直接發送包含的語句」。 – stephbu 2009-07-01 14:28:19

回答

11

該表示法允許將運行時編譯的TSQL語句與不同的參數重用;即語句只被編譯一次,這提高了效率。

4

EDIT,糟糕沒有我說paramterization代替參數替換,由於stephbu

sp_executesql的優於執行,因爲它支持參數替換,並趨向於更有效地執行。

+1

執行與參數化一樣,所以參數化不是它。什麼數據表明它「更有效地」執行它的成本至少相同。 – stephbu 2009-07-01 14:11:20

+0

說到參數替換而不是參數化可能在技術上更正確,因爲我邀請您查看以下鏈接的效率。 http://msdn.microsoft.com/en-us/library/ms175170.aspx – cmsjr 2009-07-01 14:19:50

+0

http://msdn.microsoft.com/en-us/library/ms175580.aspx作爲有關執行的其他信息支持相同的參數化語句緩存策略。 – stephbu 2009-07-01 14:20:01

4

這至少部分是爲了讓您重用查詢計劃。它可以將參數設置爲內聯,這意味着每次用不同的參數運行查詢時,分析器都會將其視爲不同的查詢並對其進行解析。但是由於它是以這種方式執行的,所以查詢計劃被緩存,並且每次運行它時都可以插入新的變量。

0

有一點需要注意的是,由於參數化,它還提供了對SQL Injection的保護。真的不能抱怨那個...

0

這是一個很好的問題。
這不是真正的答案,而是對其他答案已經給出的推理的探索。隨意更新這個「答案」

明顯的答案是「parameterized query cache」。但是,當直接執行語句時仍然可以緩存參數。

語法,這MSDN文章中的細節...

msdn_microsoft_ms175580

性能要求我沒有數據,因爲懷疑緩存似乎是直接和sp_execsql'd查詢相同。

所以,如果不是那些 - 它是什麼?

2

我不認爲這是一個性能解決方案。即使對於直接查詢,SQL中的執行計劃也被緩存。

我認爲這是一個SQL注入的安全解決方案。

但是,如果您嘗試使用在數據庫引擎優化顧問中使用Linq to SQL的跟蹤,那麼調優顧問將不會調用sp_execute,我想將其關閉。 SQL注入也可以在Linq To Sql語句/框架(代碼)中檢測到,爲什麼你甚至會嘗試向SQL發送無效數據。

相關問題