動態Sql正在成爲天使不邪惡!!!。
十年前,關係數據庫中只有兩條規則: 「始終使用存儲過程」和「從不構建動態SQL(即時查詢)」。
但是,遊戲已經隨着ORM的革命和從SQL Server 2005開始到SQL server 2016發佈的新一代SQL Server而發生了變化。
這並不令人驚訝聽到這樣的忠告:
Don’t Fear Dynamic SQL. When done correctly, it can be used effectively
動態SQL肯定是有一些缺點。但是,如果使用得當,它有許多積極的屬性,包括提高性能的能力。
條件動態SQL高性能:使用sp_executesql不EXEC
- 運行動態SQL。
- 對於有條件的地方(不要串聯值)使用參數
sp_executesql的將使用高速緩存的計劃,以獲得更多的性能。
ADO.NET將客戶端中的查詢作爲sp_executeSQL發送。您可以在SQL事件探查器中查看生成的SQL。
ORM所做的是動態生成CRUD作爲動態SQL並將數據映射到對象中以加速開發並獲得良好性能。
SQL Server具有sp_executesql,它是一個系統存儲過程,它爲參數使用參數標記和可變數量參數的SQL字符串。
因此,無論客戶何時必須執行參數化語句,客戶端都會向sp_executesql發出RPC請求。
參數化的sp_executesql調用更有可能具有可重用的緩存計劃。
存儲的過程sp_executesql成爲標準程序,用於執行從SQL Server 2005開始
動態sql與參數替換內容是查詢作爲在ADO.NET產生偶數(更新/插入/刪除)動態sql編譯並執行一個獨立於調用sp_executesql的批處理的執行計劃的執行計劃。從MSDN sp_executesql
sp_executesql的
摘錄可以用來代替的存儲過程來執行Transact-SQL語句多次在參數值在語句的變化是唯一的變化。由於Transact-SQL語句本身保持不變並且只有參數值發生更改,因此SQL Server查詢優化器可能會重用它爲第一次執行生成的執行計劃。
動態sql被執行爲: EXECUTE sp_executesql @SQLString,@ParmDefinition,@SalesID = @IntVariable;
誰有動力生成動態sql並運行良好的性能?
在客戶端,如果我們運行查詢:
var ID=1;
string commandText = "select * from products WHERE productid = @ID;";
使用ADO。NET:
生成的查詢是:
exec sp_executesql N'select * from products WHERE productid = @ID;',N'@ID int',@ID=11
小巧玲瓏的(高性能ORM)
小巧玲瓏是微ORM用於.NET開發和由堆棧溢出小組使用,聚焦以原始表現爲主要目標。
生成的查詢是:
exec sp_executesql N'select * from products WHERE productid = @ID;',N'@ID int',@ID=12
的EntityFramework EF 6.3
查詢:
var id=1;
Product p = db.Products.FirstOrDefault(t => t.ProductID == id);
的生成動態SQL:
exec sp_executesql N'SELECT TOP (1)
[Extent1].[ProductID] AS [ProductID],
[Extent1].[ProductName] AS [ProductName],
[Extent1].[SupplierID] AS [SupplierID],
[Extent1].[CategoryID] AS [CategoryID],
[Extent1].[QuantityPerUnit] AS [QuantityPerUnit],
[Extent1].[UnitPrice] AS [UnitPrice],
[Extent1].[UnitsInStock] AS [UnitsInStock],
[Extent1].[UnitsOnOrder] AS [UnitsOnOrder],
[Extent1].[ReorderLevel] AS [ReorderLevel],
[Extent1].[Discontinued] AS [Discontinued]
FROM [dbo].[Products] AS [Extent1]
WHERE [Extent1].[ProductID] = @p__linq__0',N'@p__linq__0 int',@p__linq__0=1
等工具使用高性能動態sql。
結論: 動態SQL可以用出色的表現來使用,如果它的參數,並與sp_executesql的
每個區域的不同表格都很嚇人。想想這個問題。從地區(所有地區所有銷售)中選擇SUM(銷售)。如果所有區域都不在一張表中,那麼很難做基本的報告和gui utils。 –