数据库
首页 > 数据库> > [SQL SERVER][Performance]密度和选择性

[SQL SERVER][Performance]密度和选择性

作者:互联网

[SQL SERVER][Performance]密度和选择性


3月份SQL PASS TW活动我有介绍密度和选择性关系,

统计值透过密度比率来判断索引字段选择性高低,

换句话说,索引有效性取决于统计值,统计值影响执行计划好坏,

所以统计值在数据库扮演相当重要的角色。

一般来说低密度索引字段表示高选择性(密度越低越适合nonclustered index key),

高选择性可以帮助查询优化程序在大数据量中快速搜寻小结果集,

查询调校过程中,大部分时间会花在索引优化上,

这里我大概分享一下自己如何确认索引有效性。

相信大家都有听说过,index key顺序会引响性能,

主要是因为统计值所造成,下面是当天活动demo script,

大家可以猜猜看,SQL SERVER查询优化程序会决定走那一个索引。

--#密度和选择性
select Rate,PayFrequency,ModifiedDate
from EmployeePayHistory  
where PayFrequency=2
and ModifiedDate between '2004-07-31' and '2004-08-10'

drop index idx1 on EmployeePayHistory 
create index idx1 on EmployeePayHistory(PayFrequency,ModifiedDate)
include(Rate) 

drop index idx2 on EmployeePayHistory 
create index idx2 on EmployeePayHistory(ModifiedDate,PayFrequency)  
include(Rate) 

dbcc show_statistics(EmployeePayHistory,idx1)
dbcc show_statistics(EmployeePayHistory,idx2)

idx1统计值(撷取部分)

image

PayFrequency 密度0.5

idx2统计值(撷取部分)

image

ModifiedDate 密度 0.03846154

前面我有说过低密度高选择性,所以你可能会直觉认定查询最佳化程序会走idx2 索引,

很不幸你不能只单单做这样的判断,因为选择性主要是因你查询条件数据分布所决定,

这里我有一个估算方法。

ModifiedDate between '2004-07-31' and '2004-08-10' 数据分布

image

符合ModifiedDate 条件数据分布有 277,该索引总笔数 316,所以密度 select (1.0*277)/316

image

PayFrequency=2 数据分布

image

符合PayFrequency=2条件数据分布有 136,该索引总笔数 316,所以密度 select (1.0*136)/316

image

两个索引密度都算出来,套用之前我所说的,

低密度高选择性,高选择性越适合成为nonclustered index key,

所以这次查询优化程序会使用访问索引 idx1。

image

确实使用索引idx1。

当然对于索引优化这只是一小部分,

未来如有机会希望可以和大家分享不求人系列二--索引优化不求人  微笑

原文:大专栏  [SQL SERVER][Performance]密度和选择性


标签:EmployeePayHistory,PayFrequency,SERVER,索引,选择性,ModifiedDate,密度,SQL,Performance
来源: https://www.cnblogs.com/chinatrump/p/11458483.html