2009-08-29 76 views
1

我已经创建了脚本来为每个表找到每列的选择性。在一些小于100行的列表中,列的选择性大于50%。 其中选择性=不同值/总数行创建索引的资格

那么,那些列是否有资格索引? 或者,您能否告诉我们,创建索引的资格需要多少最少的行数?

回答

4

我想我通过计算数据的“选择性”值来理解你所要达到的目标,但是你不能盲目应用规则。

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

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

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

2

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

所以你可以创建一个索引。问题是应该你创建一个索引,没有工具会告诉你,因为索引也可以是多值的,它取决于你运行的查询。创建索引是在性能调优查询时完成的,或者当您知道您将创建使用它的查询时进行抢占。

每个索引都需要进行更新,插入和删除所需的空间和时间。你不希望虚假地创建它们,所以你将不得不手动完成它,而不是脚本的结果,以查看列的价值有多独特。

+0

你开始这篇文章的方式,我真的认为你要去我们的绿色鸡蛋和火腿。可悲的是,我错了。但是,建议 - 确保在创建索引之前使用RDBMS的性能调整功能! – Eric 2009-08-29 15:29:56

+0

谢谢大家的回答。 – Paresh 2009-12-01 09:23:29

0

一般的经验法则说,如果你有一个非常大的表(超过100万行),你应该只使用索引,如果基于该索引的WHERE子句最多选择1-2数据的百分比。如果你有一个“性别”列,大约50%的值是“男性”和大约50%的“女性”,那么拥有一个索引并不会给你太多--SQL Server和大多数其他RDBMS在这种情况下,很可能仍然会进行全表扫描,因为平均而言,他们必须至少扫描一半的表格,因此首先使用索引然后查找实际完整数据的“绕行”该指数值是不值得的。

如果您拥有唯一键(客户号码)或相当有选择性的值,索引非常好。索引不是没有代价的 - 它占用磁盘空间,需要维护,它会稍微减慢除SELECT之外的所有操作 - 所以仔细的线程,它是而不是最好的办法就是盲目索引所有内容。指数太少是不好的 - 但是太多和错误的指数可能会更糟! :-)没有人声称让你的索引是正确的.... :-)

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

马克