關於SQL Server索引的最左匹配原則
近期,在交流群中有網友談到SQL Server索引的最左匹配原則,理解為T-SQL中Where條件的書寫順序的問題,這是一個誤解。
下面先看下實驗結果。
1 、準備資料。
CREATE TABLE [dbo].[t6](
[id] [int] IDENTITY(1,1) NOT NULL,
[hour] [int] NULL,
[ordernumber] [int] NULL,
CONSTRAINT [PK_t6] PRIMARY KEY CLUSTERED ( [id] ASC ) ON [PRIMARY]
) ON [PRIMARY]
GO
insert into t6 values(default,default)
-- 重複執行如下語句,生成10+M記錄
insert into t6 select id, hour from t6
update t6 set
hour=id % convert(int,300000*RAND()+2), ordernumber=id % convert(int,3000*RAND()+2)
2 、建立索引1。
create index fhsy1 on t6(hour, ordernumber)
3 、檢視兩個欄位均為等值查詢的執行計劃。
select hour,ordernumber from t6 where hour=1 and ordernumber=1
select hour,ordernumber from t6 where ordernumber=1 and hour=1
4 、建立索引2。
create index fhsy1 on t6(ordernumber, hour)
5 、再次檢視執行計劃。
6 、再看一下一個欄位為等值,另一個欄位為範圍查詢的執行計劃。
select hour,ordernumber from t6 where hour=1 and ordernumber between 1 and 2
select hour,ordernumber from t6 where ordernumber between 1 and 2 and hour=1
select hour,ordernumber from t6 where ordernumber=1 and hour between 1 and 2
select hour,ordernumber from t6 where hour between 1 and 2 and ordernumber=1
結論
1 、索引的最左匹配,是指的檢索條件與索引欄位的關係,與在T-SQL語句中Where條件中的書寫順序無關。
索引與搜尋條件的書寫順序有關,這在上世紀可能還有可能;現在的資料庫引擎的智慧化程式,應該可以透過智慧最佳化或語句改寫,實現順序無關。這一點都做不到,這個資料庫離淘汰就不遠了。
2 、從Cost來看,索引總是匹配等值檢索欄位在前的複合索引,這就是被稱為 最左匹配原則 的原因。
3 、最左匹配索引的執行計劃,是Index Seek/Scan,即先透過等值條件進行定位,再透過不等條件進行範圍掃描。一般來說,此執行計劃要優於Index Scan,即整個索引的掃描。
疑惑
在等值查詢中,CBO會自動選擇一個Cost最小的執行計劃,索引1和索引2相當,最終執行計劃選擇索引2而不是索引1,原因不明。應該和索引樹的高度、統計資訊有關。待查。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/81227/viewspace-2656982/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 索引最左匹配原則索引
- 聯合索引的最左字首匹配原則索引
- Mysql中聯合索引的最左匹配原則MySql索引
- MySQL組合索引和最左匹配原則MySql索引
- 面試中常被提到的最左字首匹配原則面試
- MySQL學習筆記:組合索引-最左原則MySql筆記索引
- Sql Server系列:索引設計原則及優化SQLServer索引優化
- Sql Server關於indexed view索引檢視的總結SQLServerIndexView索引
- 關於SQL Server 2008的缺失索引功能SQLServer索引
- 六點SQL Server索引管理規則SQLServer索引
- intentFiltger的匹配原則Intent
- 我去,為什麼最左字首原則失效了?
- 關於SQL Server中索引使用及維護簡介(zt)SQLServer索引
- MySQL索引(二):建索引的原則MySql索引
- 關於設計原則的思考
- SQL Server字串左匹配SQLServer字串
- 索引的選擇原則索引
- Sql Server關於create index include帶有包含列的索引的最全解釋SQLServerIndex索引
- MySQL索引的最左字首原理與查詢的相關優化MySql索引優化
- SQL Server索引 - 非聚集索引SQLServer索引
- 關於SQL Server的WITH(NOLOCK)和(NOLOCK)SQLServer
- 關於SQL Server的分割槽表SQLServer
- MySQL索引建立原則MySql索引
- MySQL 索引的設計原則MySql索引
- MS SQL SERVER索引優化相關查詢SQLServer索引優化
- SQL Server 索引列的順序——真的沒關係嗎SQLServer索引
- SQL Server 2008篩選索引設計準則SQLServer索引
- 關於SQL Server tempdb 的各種操作SQLServer
- 關於SQL SERVER觸發器的理解SQLServer觸發器
- 求教關於SRP原則的定義
- SQL Server 索引結構SQLServer索引
- 最佳SQL Server索引策略SQLServer索引
- 關於轉義符 在php正則中的匹配問題PHP
- 組合索引的選擇原則索引
- 資料庫建立索引的原則資料庫索引
- mysql 索引設計原則MySql索引
- SQL Server排序規則SQLServer排序
- 關於零信任的7個原則解釋