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

SQL 執行計畫優化全攻略:從掃描類型到連接策略

     編輯:關於SqlServer

核心掃描類型解析

叢集索引掃描

發生於擁有叢集索引的資料表,相當於全表掃描,但在針對叢集索引鍵條件查詢時效能較佳。

SELECT * FROM C_SY_Ownedstorm

資料表掃描

發生於堆積表(無叢集索引)且無可用索引時,需完整掃描整張表。

SELECT * FROM #temp

連接運算子深度解析

雜湊匹配

將較小的資料集建立雜湊表,再由較大資料集進行探測匹配。出現雜湊匹配通常暗示:

  • 缺少或錯誤的索引
  • 缺乏 WHERE 條件篩選
  • WHERE 子句中對欄位進行類型轉換或運算,導致索引失效

優化策略:檢查是否可透過加入適當索引或縮減資料量來改用巢狀迴圈或合併連接。

叢集索引查找

最理想的存取路徑,透過索引鍵直接定位資料。

CREATE UNIQUE CLUSTERED INDEX _Id ON t1(c1);
SELECT * FROM t1 WHERE c1 = 3;

排序運算子

SQL Server 在取得資料後才進行排序,消耗 CPU 與記憶體。可透過索引排序順序避免額外排序。

SELECT * FROM t1 ORDER BY c1 DESC;

巢狀迴圈連接

適用於小資料量表且連接欄位有索引的情況。外部表逐行迴圈,內部表索引查找匹配行。I/O 與比較次數最少。

合併連接

要求兩輸入集合已排序。單掃描即可完成連接,總成本與輸入行數總和成正比,適合大量資料連接。

測試腳本:建立大量測試資料

CREATE TABLE t1(c1 INT, c2 VARCHAR(8000));
GO
DECLARE @a INT = 1;
WHILE (@a <= 5000)
BEGIN
    INSERT INTO t1 VALUES (@a, REPLICATE('a', 5000));
    SET @a = @a + 1;
END
GO
SELECT COUNT(1) FROM t1 GROUP BY c1;

優化核心原則總結

  1. 優先尋求索引查找,避免全表/索引掃描
  2. 警惕雜湊匹配,檢查索引與 WHERE 條件
  3. 善用叢集索引,讓常用篩選欄位成為叢集鍵
  4. 減少排序,利用索引順序滿足 ORDER BY
  5. 選擇正確連接策略:小表駆動大表用巢狀迴圈,大表連大表用合併連接
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved