我是否需要设置一个只包含几个可能值的列作为tSQL的索引?
我正在创建一个SQL Server 2008数据库,其中可能包含数百万条记录,我想知道是否需要将以下内容定义为索引:我是否需要设置一个只包含几个可能值的列作为tSQL的索引?,sql,sql-server,tsql,select,indexing,Sql,Sql Server,Tsql,Select,Indexing,我正在创建一个SQL Server 2008数据库,其中可能包含数百万条记录,我想知道是否需要将以下内容定义为索引: 仅可包含0和1的TINYINT列 TINYINT列可能只包含:0、5和6 PS.这两个列都将在WHERE子句中用于选择。这不是一个好主意,因为索引的选择性将很低,并且由于这一点而不是“加速”,这可能是一个缺点 具有相同值的行越少,索引的选择性越好 在其他一些情况下,甚至全表扫描可能更有效 假设:您有一百万行。那么第一个指数的选择性为: (选择性=不同的值/行) 在另一种情况下:
PS.这两个列都将在WHERE子句中用于选择。这不是一个好主意,因为索引的选择性将很低,并且由于这一点而不是“加速”,这可能是一个缺点 具有相同值的行越少,索引的选择性越好 在其他一些情况下,甚至全表扫描可能更有效 假设:您有一百万行。那么第一个指数的选择性为: (选择性=不同的值/行) 在另一种情况下:
3 / 1.000.000 = 0,000003
这些值非常低强>
或者以另一种方式:
估计选择性比率=(总行数/不同值)/TotalRows*100=1/Distinc值*100
第一种情况是50%,第二种情况是33%
Sql server的优化器不使用此比率大于15%的索引
(我的计算是一个简单的估计,但你可以在中找到统计信息)这不是一个好主意,因为指数的选择性将很低,并且因为这不是“加速”,而是一个缺点 具有相同值的行越少,索引的选择性越好 在其他一些情况下,甚至全表扫描可能更有效 假设:您有一百万行。那么第一个指数的选择性为: (选择性=不同的值/行) 在另一种情况下:
3 / 1.000.000 = 0,000003
这些值非常低强>
或者以另一种方式:
估计选择性比率=(总行数/不同值)/TotalRows*100=1/Distinc值*100
第一种情况是50%,第二种情况是33%
Sql server的优化器不使用此比率大于15%的索引
(我的计算只是一个简单的估计,但你可以在中找到统计信息)不,基本上不会单独使用这些列的索引 但是这种低选择性键非常适合作为索引中最左边的列的组合键。例如,假设
TINYINT(0,1)
(为什么不使用btw?)是删除的列。您经常遇到以WHERE deleted=0和…
为谓词的查询。将其作为聚集索引中最左边的列添加通常是正确的方法。或者,如果谓词是,比如说,WHERE name='…',deleted=0
,您应该在(deleted,name)
上建立一个非聚集的索引
另一个选项是使用:create index。。在(名称)上,其中(已删除=0)
但这不包括您对deleted=1
感兴趣的情况
对于几乎没有不同值的列(例如,type
列)也是如此。同样,使其成为复合索引中最左边的键通常是很有意义的
请注意,如果在索引中添加一个低选择性键作为最左边的键,并且没有在谓词中指定此列(例如,其中name=“…”
w/o添加已删除的任何条件),则不能使用索引,只能使用(name)
(或on(name…)
)上的索引,例如,name
是最左边的键
为什么不把它弄得最结实呢?例如,索引(名称,已删除)
?因为只有在您想要强制实施唯一约束的情况下,通常没有好处。只有0或1可从(名称)
上的索引或(名称,已删除)
上的索引中选择,基本上提供相同的性能(如果可以使用)。将low selectivity(低选择性)键置于左侧可启用某些范围扫描场景(例如,type=5的情况下)。不,基本上不会单独使用这些列上的索引
但是这种低选择性键非常适合作为索引中最左边的列的组合键。例如,假设TINYINT(0,1)
(为什么不使用btw?)是删除的列。您经常遇到以WHERE deleted=0和…
为谓词的查询。将其作为聚集索引中最左边的列添加通常是正确的方法。或者,如果谓词是,比如说,WHERE name='…',deleted=0
,您应该在(deleted,name)
上建立一个非聚集的索引
另一个选项是使用:create index。。在(名称)上,其中(已删除=0)
但这不包括您对deleted=1
感兴趣的情况
对于几乎没有不同值的列(例如,type
列)也是如此。同样,使其成为复合索引中最左边的键通常是很有意义的
请注意,如果在索引中添加一个低选择性键作为最左边的键,并且没有在谓词中指定此列(例如,其中name=“…”
w/o添加已删除的任何条件),则不能使用索引,只能使用(name)
(或on(name…)
)上的索引,例如,name
是最左边的键
为什么不把它弄得最结实呢?例如,索引(名称,已删除)
?因为只有在您想要强制实施唯一约束的情况下,通常没有好处。只有0或1可从(名称)
上的索引或(名称,已删除)
上的索引中选择,基本上提供相同的性能(如果可以使用)。将低选择性键置于左侧可启用某些范围扫描场景(例如,其中type=5
)。为什么不为0,1
列设置BIT
?以后可以扩展到更多的值吗?很好。谢谢我会改变的。性病