【发布时间】:2010-09-18 20:52:25
【问题描述】:
我记得有一次读到,索引具有低基数(少量不同值)的字段并不值得做。我承认我对索引的工作原理知之甚少,无法理解为什么会这样。
如果我有一个包含 1 亿行的表,并且我正在选择位字段为 1 的记录,该怎么办?假设在任何时间点,只有少数记录位字段为 1(而不是 0)。是否值得索引该位字段?为什么?
当然我可以测试它并检查执行计划,我会这样做,但我也很好奇它背后的理论。基数什么时候重要,什么时候不重要?
【问题讨论】:
-
这是一个常见的查询吗?在查找“少数”记录时可能值得这样做,但在其他行上对您没有太大帮助。还有其他方法可以识别数据吗?
-
虽然我不认为我会单独索引一个位列,但将位列作为复合索引的一部分包含在内是很常见的。当您的应用程序几乎总是在寻找活跃的客户时,一个简单的例子是 ACTIVE 的索引,LASTNAME 而不仅仅是姓氏。
-
“我记得有一次读到,索引具有低基数(不同值的数量很少)的字段并不真正值得做”那是因为 SQL Server 几乎总是会发现这样做更有效率表扫描比读取索引。所以基本上你的索引永远不会被使用,维护它是一种浪费。正如其他人所说,在复合索引中可能没问题。
-
我不同意。如果您的分布是 50/50,那么您永远不会使用索引,因为执行表扫描会更快。但是,如果你只有5个、1个值、100万个0个值,那么在搜索1的时候很有可能会用到索引。
-
在您给出的示例中,我更倾向于将姓氏放在首位。这取决于具体的查询工作负载,但一般来说,优先选择更具选择性的列意味着更有可能使用索引。
标签: sql-server indexing