[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统计值(撷取部分)
PayFrequency 密度0.5
idx2统计值(撷取部分)
ModifiedDate 密度 0.03846154
前面我有说过低密度高选择性,所以你可能会直觉认定查询最佳化程序会走idx2 索引,
很不幸你不能只单单做这样的判断,因为选择性主要是因你查询条件数据分布所决定,
这里我有一个估算方法。
ModifiedDate between '2004-07-31' and '2004-08-10' 数据分布
符合ModifiedDate 条件数据分布有 277,该索引总笔数 316,所以密度 select (1.0*277)/316
PayFrequency=2 数据分布
符合PayFrequency=2条件数据分布有 136,该索引总笔数 316,所以密度 select (1.0*136)/316
两个索引密度都算出来,套用之前我所说的,
低密度高选择性,高选择性越适合成为nonclustered index key,
所以这次查询优化程序会使用访问索引 idx1。
确实使用索引idx1。
当然对于索引优化这只是一小部分,
未来如有机会希望可以和大家分享不求人系列二--索引优化不求人
原文:大专栏 [SQL SERVER][Performance]密度和选择性
标签:EmployeePayHistory,PayFrequency,SERVER,索引,选择性,ModifiedDate,密度,SQL,Performance 来源: https://www.cnblogs.com/chinatrump/p/11458483.html