關於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關於indexed view索引檢視的總結SQLServerIndexView索引
- 關於SQL Server中索引使用及維護簡介(zt)SQLServer索引
- SQL Server索引 - 非聚集索引SQLServer索引
- SQL Server 2014的重建索引SQLServer索引
- Sql Server關於create index include帶有包含列的索引的最全解釋SQLServerIndex索引
- 關於正則位置匹配(斷言)的技巧
- SQL Server 索引結構SQLServer索引
- MySQL索引(二):建索引的原則MySql索引
- 我去,為什麼最左字首原則失效了?
- 最佳化SQL Server索引的技巧SQLServer索引
- MySQL 索引的設計原則MySql索引
- MySQL索引建立原則MySql索引
- 關於SQL Server配置管理器SQLServer
- 關於轉義符 在php正則中的匹配問題PHP
- mysql 索引設計原則MySql索引
- SQL Server2014 雜湊索引原理SQLServer索引
- MySQL資料庫的索引原理、與慢SQL優化的5大原則MySql資料庫索引優化
- sql server 索引闡述系列七 索引填充因子與碎片SQLServer索引
- 關於零信任的7個原則解釋
- 基於準則匹配的影像對準
- 關於SQL Server 映象資料庫快照的建立及使用SQLServer資料庫
- 理解SQL Server 2008索引的儲存結構YDSQLServer索引
- 關於索引索引
- (轉)SQL 優化原則SQL優化
- SQL Server關於AlwaysOn的理解-讀寫分離的誤區(一)SQLServer
- Mysql研磨之設計索引原則MySql索引
- sql server對於日期的處理SQLServer
- 關於pcl索引的使用索引
- MySQL實驗: 實踐索引對全列匹配、最左字首匹配、範圍查詢等條件的影響以及瞭解髒讀、幻讀等MySql索引
- MySQL-08.索引的建立和設計原則MySql索引
- 聯合索引和多個單列索引使用中的索引命中情況及索引建立原則索引
- 關於runat = “server”Server