我有一个潜在高达5.000.000行的表.此表中的一个列在查询中单独使用,但此列只有5个可能的值,目前我有10.000行,根据解释计划,在该列上使用我的索引是没有意义的.
它是否曾经或者不应该为索引而烦恼
编辑:这是目前的两个解释计划 没有索引http://img706.imageshack.us/img706/1903/noindex.png 与 强制索引通过提示http://img692.imageshack.us/img692/8205 /indexp.png 后一个图像我用一个提示强制使用索引.
这取决于几件事.
首先是价值的分配.如果您只有五个不同的值,但其中一个占表中行的99.9999%,那么显然您不希望优化器使用该值的索引,但您可能希望它将其用于其他值.在某些情况下,使用基于函数的索引是值得的,以确保您只索引感兴趣的值而不是仅占用空间的值.
其次,是否可以使用该索引回答查询而无需访问表?
请注意,重要的不仅仅是要访问的行的百分比,而是需要访问的表的块数.例如,如果平均每个块有一个包含1000个块和30个行的表,并且一个列有30个不同的值(每个值在1000行中存在),那么需要访问的块数才能读取每一行单个值在1000/30 = 34(值得使用索引)和1000(不值得使用索引)之间变化,具体取决于行的分布方式.这由索引的聚类因子表示 - 如果它的值接近表中的行数,那么索引不太可能被使用,如果它接近于块的数量那么它更可能是用过的.
另外,您可能会查看索引压缩以查看是否可以节省空间.
小心位图索引 - 它们对于多个会话同时修改的系统不友好(例如,两个人同时将行插入到索引表中).
如果您希望通过这五个值的谓词来提高查询效率,那么更有效的策略是使用分区,部分原因是查询中的分区修剪,还因为优化器可用的统计数据有所改进将访问一个分区,并且可以使用分区级统计信息而不是全局统计信息.