添加组合索引时,做相等运算字段应该放在最前面
?
有一個通常的誤解,覺得應該把選擇性高的字段放在最前面,這通常只是針對一個字段的索引,對于組合索引,常常要把做等式運算的字段放在最前面,看看測試
USE AdventureWorks GOCREATE TABLE demo1 ( id INT identity(1,1) PRIMARY KEY,gender char(1) NOT NULL ,age int NOT NULL,DESCRIPTION varchar(1000) default(replicate('a',1000)) )--填充數字輔助表 --DROP TABLE #numSELECT row_number() over( order BY customerid ) AS number INTO #num FROM adventureworks.sales.Individual--插入測試數據 INSERT demo1 (gender,age) SELECT CASE WHEN number%2=0 THEN 'f'ELSE 'm'END,abs(checksum(newid()))%80 FROM #num
?
創建如下的索引:
CREATE INDEX ix_age_sex ON demo1(age,gender) include(description) WITH (online=on) ?查詢如下的語句:
DBCC FREEPROCCACHE CHECKPOINT DBCC DROPCLEANBUFFERSSELECT age,gender,description FROM demo1 WHERE gender='f' AND age BETWEEN 30 AND 40
邏輯讀為:
(1236 row(s) affected)
Table 'demo1'. Scan count 1, logical reads 350, physical reads 3, read-ahead reads 346, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
現在刪除原來的索引,創建低選擇性在前的索引
DROP INDEX ix_age_sex ON demo1 CREATE INDEX ix_age_sex ON demo1(gender,age)INCLUDE (description) WITH (online=on)在來查詢相同的語句:
DBCC FREEPROCCACHE CHECKPOINT DBCC DROPCLEANBUFFERSSELECT age,gender,description FROM demo1 WHERE gender='f' AND age BETWEEN 30 AND 40
邏輯讀為:
(1236 row(s) affected)
Table 'demo1'. Scan count 1, logical reads 181, physical reads 3, read-ahead reads 178, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
?
可以看到低選擇性的字段放在前面邏輯讀有350減少到了181,由此產生性能提升
?
總結:1:做等式運算的字段放在最前面,如果有多個等式運算,才要考慮等式運算字段的選擇性
???????轉載于:https://www.cnblogs.com/fly_zj/archive/2012/08/11/2633629.html
總結
以上是生活随笔為你收集整理的添加组合索引时,做相等运算字段应该放在最前面的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 模拟I2C怎么用--教你使用GPIO口模
- 下一篇: Connection to node 0