我创建了脚本来查找所有表的每列的选择性。在一些行少于100行的表中,列的选择性超过50%。 选择性=不同值/总数行的位置。这些列是否有资格获得索引?或者,您能告诉我创建索引的行数的最低要求吗?
答案 0 :(得分:5)
您可以索引任何列 - 问题是它是否有意义以及是否将使用该索引....
通常,选择性小于1-5%可能有效 - 百分比越小越好。最好的是大群体中的单个值,例如单个客户ID数十万 - 肯定会使用这些指数。
性别(仅2个值)或其他仅具有非常有限数量的可能值的事物通常在索引上不能很好地工作。至少在他们自己的位置 - 这些列可能可以作为第二列或第三列包含在另一个索引中。
但实际上,找出索引是否有意义的唯一方法是
关于何时使用(或忽略)索引没有黄金法则 - 太多的变量会影响该决定。
有关如何处理索引的专家建议,以及如何找出哪些索引可能无法使用,以及何时创建索引,请参阅Kimberly Tripp的博客文章:
答案 1 :(得分:2)
大多数DBMS对数据和代码(存储过程,执行计划等)使用缓存。在SQL Server中,我认为它称为数据和过程缓存,在Oracle中,它称为缓冲区缓存和 SGA < / em>的。表数据和/或索引可以在缓存中。
经常访问的小表很可能适合缓存。但是,如果查询从磁盘加载新数据,则可以从缓存中逐出该表。有一些选项可以指示您希望表格永久保留在缓存中(请参阅PINTABLE)。如果您的表非常小(这是您的情况),那么使用索引可能是更好的策略。添加索引(也总是在缓存中)可能会有所帮助,但我不知道会有什么好处。
性能的巨大差异是磁盘访问与内存访问。索引的目的是减少从磁盘读取的数据量,但如果它已经在内存中,则增益可能很小。
答案 2 :(得分:0)
我不确定sql-server,但是如果它可以检索单个I / O中的所有表行,则大多数DBMS不使用索引进行检索。您将在PLAN解释中看到这一点,一些表始终是表空间扫描。
恕我直言,如果DBMS在服务器上运行,任何少于5000行的表都不值得分析基数。