我是否需要设置一个只包含几个可能值的列作为tSQL的索引?

我是否需要设置一个只包含几个可能值的列作为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子句中用于选择。这不是一个好主意,因为索引的选择性将很低,并且由于这一点而不是“加速”,这可能是一个缺点 具有相同值的行越少,索引的选择性越好 在其他一些情况下,甚至全表扫描可能更有效 假设:您有一百万行。那么第一个指数的选择性为: (选择性=不同的值/行) 在另一种情况下:

我正在创建一个SQL Server 2008数据库,其中可能包含数百万条记录,我想知道是否需要将以下内容定义为索引:

  • 仅可包含0和1的TINYINT列

  • TINYINT列可能只包含:0、5和6


  • 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
    ?以后可以扩展到更多的值吗?很好。谢谢我会改变的。性病