2013-05-29 93 views
2

我通過以下方式(我正在使用存儲過程)創建一個Sql動態查詢,但我想知道,它是否有任何性能下降比較,我們在字符串中執行該動態查詢形式由sp_Executesqlsp動態查詢性能比較在sql

SELECT * 
FROM CityToCityTransferPricing as ctp 
INNER JOIN VehicleDynamicPackage as vdp on ctp.vehicleId=vdp.vehicleId 
INNER JOIN VehicleType as vt on vdp.vehicleTypeId=vt.vehicleTypeId 
WHERE [email protected] 
    AND (
     @vehicleID is null 
     OR [email protected] 
    )  
    AND (
     @status is null 
     OR [email protected] 
    ) 

回答

1

在一般情況下,使用動態查詢時,你不會看到顯著的性能下降。

而且也看到這一點 -

SELECT * 
FROM dbo.CityToCityTransferPricing ctp 
JOIN dbo.VehicleDynamicPackage vdp ON ctp.vehicleId = vdp.vehicleId 
JOIN dbo.VehicleType vt ON vdp.vehicleTypeId = vt.vehicleTypeId 
WHERE cityToCityTransferID = @cityToCityTransferID 
    AND ISNULL(@vehicleID, ctp.vehicleId) = ctp.vehicleId 
    AND ISNULL(@status, ctp.[status]) = ctp.[status] 
+0

多少成本更低,當它是一個簡單的查詢,我們使用 [email protected]到位 ISNULL(@vehicleID,ctp.vehicleId)= ctp.vehicleId – Vishwajeet

+0

的您不會在查詢執行時間中看到差異。這只是一個很好的編碼風格:) – Devart

+0

好的,N這是我的要求,通過傳遞null,我刪除那個特定的條件:) – Vishwajeet

1

有能適合所有的情況下,沒有一般的答案。你能做的最好的事情是檢查執行計劃並親自查看。我同意Devart在大多數情況下你可能不會注意到任何區別。

這裏是動態SQL一個良好的閱讀:http://www.sommarskog.se/dynamic_sql.html

1

你必須知道,動態SQL將永遠是重新編譯。所以表現明智,這不是一件好事。在這種情況下,您可能沒有注意到它,但我仍然會採用最佳實踐,而不是使用動態SQL。另外,如果你真的必須使用動態查詢,你也可以查看sp_executesql和EXEC。 EXEC也會一直給你一個新的查詢計劃(無緩存),其中sp_executesql第一次編譯查詢並在第二次重用它的計劃。

0

如果您使用的是參數化的sp_execute_sql,則沒有多大區別。但是,如果您正在動態生成動態字符串並執行它,則可能會對性能產生影響。請參考以下鏈接:Dynamic SQL Performance comparison