首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 性能優化五大實戰技巧:IDENTITY 取回、內嵌視圖、覆蓋索引、參數化與統計維護

     編輯:關於SqlServer

技巧一:INSERT 後高效取回 IDENTITY 值

問題場景

應用層需獲取剛插入行的自增 ID,常見錯誤模式導致額外往返或記錄集混淆。

最佳模式


-- 單批次執行,SET NOCOUNT ON 抑制 DONE_IN_PROC
SET NOCOUNT ON;
INSERT INTO Products (ProductName) VALUES ('Chalk');
SELECT SCOPE_IDENTITY() AS NewID;  -- 推薦:僅返回當前作用域標識

ADO.NET 調用


using (var cmd = conn.CreateCommand()) {
    cmd.CommandText = "SET NOCOUNT ON; INSERT INTO Products (ProductName) VALUES (@n); SELECT SCOPE_IDENTITY();";
    cmd.Parameters.AddWithValue("@n", "Chalk");
    var newId = Convert.ToInt32(cmd.ExecuteScalar()); // 直接獲取標量
}

觸發器方案(透明化)


CREATE TRIGGER tr_Products_Ins ON Products FOR INSERT AS
SELECT SCOPE_IDENTITY() AS NewID;

任何 INSERT 自動返回 ID,應用層無感知。注意:觸發器增加微小開銷,批量插入時每行觸發。

技巧二:內嵌視圖/CTE 替代臨時表

臨時表模式(傳統)


CREATE TABLE #Top5Orders (OrderID INT, OrderDate DATETIME);
INSERT INTO #Top5Orders SELECT TOP 5 OrderID, OrderDate FROM Orders ORDER BY OrderDate DESC;
SELECT p.ProductName, SUM(od.Quantity) AS Qty
FROM #Top5Orders t
JOIN [Order Details] od ON t.OrderID = od.OrderID
JOIN Products p ON od.ProductID = p.ProductID
GROUP BY p.ProductName;
DROP TABLE #Top5Orders;

CTE/內嵌視圖模式(現代)


WITH Top5Orders AS (
    SELECT TOP 5 OrderID, OrderDate FROM Orders ORDER BY OrderDate DESC
)
SELECT p.ProductName, SUM(od.Quantity) AS Qty
FROM Top5Orders t
JOIN [Order Details] od ON t.OrderID = od.OrderID
JOIN Products p ON od.ProductID = p.ProductID
GROUP BY p.ProductName;

優勢

  • 無 TempDB 分配/釋放/鎖爭用。
  • 優化器可整體推導執行計劃,可能消除中間物化。
  • 代碼簡潔、無副作用、天然並行安全。

技巧三:覆蓋索引消除 Key Lookup

見 20340 詳細展開。核心:INCLUDE 覆蓋高頻 SELECT 列,讓查詢完全在索引內完成。

技巧四:強制參數化與計劃復用

  • 數據庫級:ALTER DATABASE ... SET PARAMETERIZATION FORCED(謹慎,需測試)。
  • 語句級:sp_executesql / ORM 參數化,避免臨時 SQL 產生大量單用計劃。
  • 優化器提示:OPTION (OPTIMIZE FOR @param = 'typical_value') 解決參數嗅探問題。

技巧五:統計信息主動維護策略

結語

性能優化無銀彈,但這五大技巧——標量返回、CTE 替代臨時表、覆蓋索引、參數化復用、統計主動維護——覆蓋了 80%+ 的常見性能痛點,是每位 SQL 開發者與 DBA 的必備工具箱。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
策略適用場景命令
自動更新 (默認)中小表、均勻分布AUTO_UPDATE_STATISTICS ON
異步更新高併發、拒絕等待統計更新AUTO_UPDATE_STATISTICS_ASYNC ON
全掃描手動更新大表、斜度數據、關鍵查詢UPDATE STATISTICS tbl WITH FULLSCAN
增量統計 (2014+)分區表、僅更新活躍分區UPDATE STATISTICS tbl WITH INCREMENTAL = ON
定時作業低峰期全量維護Agent Job + sp_updatestats / 自定義腳本