在具有较小可变性的字段上创建索引是否有意义?

时间:2010-04-27 10:56:24

标签: sql sql-server-2005 tsql indexing performance

我听说当字段变化较小时创建索引是没有意义的 例如,如果它只存储 A,B,C,D 值,则不会有这样的索引的好处,并且在执行查询时,更多的SQL服务器根本不会使用它。

我想知道你对此事的意见?

修改

样本用法

Select * FROM Table WHERE Status = 'A'   -- A means Active

或与其他字段组合

Select * FROM Table WHERE Group_ID = 123 AND Status = 'A'   

3 个答案:

答案 0 :(得分:2)

一般建议是low-cardinality字段上的索引很少有用。

B-tree indexes对高基数数据最有效(即具有许多可能值的列,其中列中的数据是唯一的或几乎唯一的。)

某些数据库引擎(如Oracle和PostgreSQL)支持Bitmap Indexes。传统上,位图索引被认为适用于性别(男性或女性)等数据,这些数据具有少量不同的值,但很多都出现这些值。


更新:

除了示例用法之外,请注意,对于第二个查询,Group_ID上的索引可能就足够了。

在第一个查询中,您应该考虑如何限制结果。它还取决于您计划运行此查询的频率。在某些情况下,全表扫描可能是唯一的选择。

答案 1 :(得分:1)

如果替代方案是表格扫描,那么如果它是一张大桌子,它可能是值得的,但是看看是否有可能使它成为covering index 以获得更多的好处。

答案 2 :(得分:0)

您是否会单独使用此专栏?像这样:

SELECT TheCol FROM Mytable WHERE myCol = 'A'

如果没有,那么它将覆盖或复合,并可能使包含此列的查询受益。

没有更多信息很难说

编辑:如果你正在进行SELECT *,所有投注都会被取消。但是,第二列的两列索引可能有所帮助。