创建索引的资格

时间:2009-08-29 14:43:13

标签: sql sql-server sql-server-2005

我创建了脚本来查找每个表的每列的选择性。在那些少于100行的表中,但列的选择性超过50%。 其中Selectivity = Distinct Values / Total Number Rows

那么,这些专栏是否有资格获得索引? 或者,您能说出,创建索引的资格需要多少行?

3 个答案:

答案 0 :(得分:4)

我想通过计算数据的“选择性”值来了解您要完成的工作,但不能盲目地应用该规则。

事实上,对于某些查询,“选择性”值可能非常低,索引仍然非常有用。例如:
假设一个包含数百万行的“收件箱”表,这些行有一个“读取”布尔字段。在这种情况下,行数上的不同值将非常低。如果大多数时间都阅读了大多数项目,那么在此字段中查找带有索引的未读项目将非常有效。

创建索引索引需要付出代价。虽然您可以获得读取的好处,但您需要为写入和磁盘使用付费。

我宁愿建议您相应地分析您的查询和索引。您还可以查看 sys.dm_db_missing_index_group_stats 中的数据以及其他动态管理视图,这些视图可让您深入了解索引的使用(或缺失)。

答案 1 :(得分:2)

您可以在包含0行,1行或1亿行的表上创建索引。您可以创建一个索引,其中每列具有相同的值或唯一值。

因此 可以 创建索引。问题是 你创建了一个索引,没有工具可以告诉你,因为索引也可以是多值的,它取决于你运行的查询。创建索引是在性能调优查询时完成的,或者在您知道要创建正在使用它的查询时先发制人。

每个索引都需要进行更新,插入和删除所需的空间和时间。您不希望虚假地创建它们,因此您真的必须手动执行此操作,而不是通过脚本来查看列值的唯一性。

答案 2 :(得分:0)

一般的经验法则说,如果你有一个非常大的表(超过100万行),你应该只使用一个索引,如果基于该索引的WHERE子句最多选择1-2%左右的东西数据。

如果你有一个“性别”列,大约50%的值是“男性”,大约50%是“女性”,那么拥有一个索引确实不会给你太多 - SQL Server和大多数其他RDBMS将在这种情况下,很可能仍然会进行全表扫描,因为平均而言,他们必须扫描至少一半的表,所以首先使用索引然后查找实际的完整数据“绕行”指数值是不值得的。

如果您拥有类似唯一键(客户编号)或非常有选择性的值,那么索引就非常出色。一个索引并非没有成本 - 它占用磁盘空间,需要维护,它会略微减慢SELECT之外的所有操作 - 所以线程仔细,它是最好的想法,只是盲目索引一切。指数太少是不好的 - 但是太多,而错误的指数可能更糟糕! :-)没有人声称你的指数是正确的....: - )

但肯定有帮助 - 我知道的最好的来源是金伯利·特里普的优秀blog posts on SQL Server indexing(以及许多其他主题)。

马克

相关问题