2013-03-18 53 views
0

我有兩種方式編寫查詢。一旦這樣的:sp_executesql正在使我的動態查詢運行速度慢很多

declare @var1 int 
declare @var2 int 


set @var1 = 1 
set @var2 = 50 

declare @myQuery = nvarchar(max) 
set @myQuery = 'INSERT INTO someTable 
       @var1 
       WHERE something = @var2' 

EXEC sp_executesql @myQuery, 
    N'@var1 int, 
    @var2 int', 

我也有查詢爲:

declare @var1 int 
declare @var2 int 
set @var1 = 1 
set @var2 = 50 

INSERT INTO someTable 
@var1 
WHERE something = @var2 

我真正的查詢是非常非常長和複雜。第一種方式大約需要4分鐘,而第二種方式大約需要20秒。到底是怎麼回事!?我一直在研究類似的問題,並且不斷地看到關於查詢緩存的一些事情,但通常這是因爲人們並不是第一種方式,他們只是在nvarchar上執行exec。

我很不熟悉SQL,完全失去了。任何幫助都會很棒。

我這樣做的第一種方式的原因是,我從C#調用存儲過程,並在參數中傳遞它。

+0

在這些情況下,由於參數嗅探,查詢運行時經常存在問題。您也可能會遇到隱式轉換導致某些索引不能使用的問題。問題的關鍵可能是各種各樣的事情,但是如果沒有更準確的複雜性表示,你只會得到隨機的猜測和猜測。要回答這個問題,您需要在查詢中提供查詢和相關模式對象。 – 2013-03-18 14:17:45

回答

0

如果您使用的是SSMS,可以選擇顯示查詢的執行計劃。看看這個,看看每種情況有什麼不同。

我對你做第一種方式的理由感到困惑......你的存儲過程的sp_executesql部分是什麼?或者你只是試圖模仿從SSMS存儲的過程?

+0

實際存儲過程從輸入參數生成一些動態SQL,將其放入nvarchar,然後在最終字符串上使用sp_executesql。 – user1652427 2013-03-18 14:08:49

相關問題