user960567 Asked: 2015-05-11 05:34:31 +0800 CST2015-05-11 05:34:31 +0800 CST 2015-05-11 05:34:31 +0800 CST 只有 3 个状态的列索引? 772 我有一张有数百万行的表。该表有一个我们经常过滤的列(意味着我们经常在 WHERE 子句中使用它),值是插入/更新/忽略。向列添加索引是否有意义?有人告诉我在少数值列上添加索引没有任何好处 sql-server sql-server-2012 2 个回答 Voted jkavalik 2015-05-11T05:59:47+08:002015-05-11T05:59:47+08:00 在低基数列上添加索引可能是有意义的,例如,如果您需要搜索非常罕见的值 - 假设您有可能为 New/Processed 的列 State 并且 95% 的行设置为 Processed,并且您必须获得那些 New经常 - 然后索引将帮助您快速找到它们。但是拥有它意味着优化器可以尝试在糟糕的情况下使用。 通常建议不要单独索引此类列,而是将其用作可以帮助特定查询的多列索引的一部分(例如 - 您想要从最旧到最新处理这些新记录,然后在 (State, CreatedTime ) 并像“where State = 'New' order by CreatedTime ASC”一样查询它,这个索引将让您快速获得那些 New 并且已经订购。 Best Answer James Z 2015-05-11T19:06:42+08:002015-05-11T19:06:42+08:00 如果您的索引仅包含状态字段,则很可能不会使用它,因为对于从索引中找到的每一行,您选择的其余列必须从聚集索引中获取,并且这些键查找将很昂贵,而且很可能是更有效的只是扫描聚集索引。 如果 where 子句中有其他字段,则复合索引应该会更好。拥有状态字段还取决于它是否正在更新(经常),因为这也需要维护索引。 一种选择是将您在选择部分中的字段添加为包含的列。这样查询就不必转到聚集索引,而且工作速度应该很快。你应该试试这个,看看它是否真的适用于你的情况。当然会有维护开销,这取决于几件事,尤其是索引中包含的字段更新的频率。 如果有一种很少见的状态用于获取行,那么过滤索引可能会起作用,但我认为这不是你的情况。
在低基数列上添加索引可能是有意义的,例如,如果您需要搜索非常罕见的值 - 假设您有可能为 New/Processed 的列 State 并且 95% 的行设置为 Processed,并且您必须获得那些 New经常 - 然后索引将帮助您快速找到它们。但是拥有它意味着优化器可以尝试在糟糕的情况下使用。
通常建议不要单独索引此类列,而是将其用作可以帮助特定查询的多列索引的一部分(例如 - 您想要从最旧到最新处理这些新记录,然后在 (State, CreatedTime ) 并像“where State = 'New' order by CreatedTime ASC”一样查询它,这个索引将让您快速获得那些 New 并且已经订购。
如果您的索引仅包含状态字段,则很可能不会使用它,因为对于从索引中找到的每一行,您选择的其余列必须从聚集索引中获取,并且这些键查找将很昂贵,而且很可能是更有效的只是扫描聚集索引。
如果 where 子句中有其他字段,则复合索引应该会更好。拥有状态字段还取决于它是否正在更新(经常),因为这也需要维护索引。
一种选择是将您在选择部分中的字段添加为包含的列。这样查询就不必转到聚集索引,而且工作速度应该很快。你应该试试这个,看看它是否真的适用于你的情况。当然会有维护开销,这取决于几件事,尤其是索引中包含的字段更新的频率。
如果有一种很少见的状态用于获取行,那么过滤索引可能会起作用,但我认为这不是你的情况。