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