Oracle SQL Developer v3的SQL Tuning Advisor为我的查询建议如下:
考虑运行Access Advisor以改进物理架构设计或创建建议的索引. 如果您选择创建推荐索引,请考虑删除索引 " SCHEMANAME "." INDEXNAME "(在"COLUMN1"上),因为它是推荐索引的前缀.
create index SCHEMANAME.NEW_INDEXNAME on SCHEMANAME.TABLENAME("COLUMN1","COLUMN2");
是否有任何伤害不是在做大胆的建议?问题是它建议丢弃的现有索引被其他程序使用.我不认为这些因素会相互"伤害",是否有任何缺点让两个索引与它们将占用的磁盘空间分开,并且在插入/更新时性能下降不明显?
因此,假设OLD INDEX在[Column1]上并且RECOMMENDED INDEX在[Column1] [Column2]上,则建议的索引也可用于现有查询.
简而言之:正如您所说,删除 OLD INDEX会提高插入/更新的性能,也不会降低在使用OLD INDEX的查询上搜索过扫描的能力.推荐索引仍然允许查找[Column1]值以及[Column1] [Column2]值.
因此,除了更新/插入的性能下降和额外的存储开销之外没有任何损害,但是维护这两个索引也没有任何好处.
实际上,当您在单列上删除索引时,性能可能会下降.
假设你用查询进行查询WHERE [Column1] = 123
.这可以通过原始索引完美地解决.新索引也可用于此,但将依赖于实现 - 需要读取索引中[Column2]的值,即使它们未被使用.
所以是的:从理论上说,降低指数可能是一个缺点:增加读数.
[9月9日更新]
最近我遇到了另一种情况,即单个索引可以比组合索引好得多.
考虑一个巨大的表'错误'列[status],[createdate]和其他一些字段.大多数错误将被关闭,因此对于100条记录,状态为"0"(打开),对于99000条记录,"1"(已关闭).
SELECT * FROM bugs WHERE status = '0'
将从索引中获益,status
而SELECT * FROM bugs WHERE status = '1'
索引status
则无济于事.
Oracle将了解其差异,因为它构建了索引的统计信息.
但是,status, createdate
每个索引条目的组合索引几乎是唯一的,Oracle将决定不使用索引进行查询,SELECT * FROM bugs WHERE status = '0'
因为它猜错(错误地)索引无效.
因此,在这种情况下,不应仅仅因为它是组合索引的前缀而丢弃单个索引.
注意:从理论上讲,Oracle可以在索引上构建更智能的统计数据,但似乎并没有这样做.
不丢弃原始索引的危害是Oracle在只需要一个索引时维护两个索引的开销.
离开它们的缺点是CRUD操作在桌面上的表现有所下降,我从你的帖子中发现,这可能是"微不足道的",但是随着时间的推移,桌子会增长,这将导致你遇到的问题要补救.
它还会不必要地占用更多存储空间.
您之前的程序仍然可以使用新索引.
留下不必要的索引会使未来的开发人员和DBA必须支持您的数据库,这会花费他们花费时间和精力来调查重复索引存在的原因.
我没有寻找不放弃原始索引的理由,而是寻找保留它的理由.
删除它,测试你的"其他"程序的性能,你应该看到一点点差别,如果有问题你可以调查原因,如果有必要更换它.