Sql 是否需要考虑删除现有索引,因为它是推荐索引的前缀

Sql 是否需要考虑删除现有索引,因为它是推荐索引的前缀,sql,performance,oracle,query-optimization,Sql,Performance,Oracle,Query Optimization,Oracle SQL Developer v3的SQL调优顾问为我的查询提供了以下建议: 考虑运行Access Advisor以改进物理模式 设计 或者创建推荐的索引如果选择创建 建议索引,考虑删除索引< /强> “SCHEMANAME”。“INDEXNAME”(在“COLUMN1”上),因为它是 推荐索引。 在SCHEMANAME.TABLENAME(“COLUMN1”、“COLUMN2”)上创建索引SCHEMANAME.NEW_INDEXNAME 不用粗体写建议有什么害处吗?问题是,它建议删

Oracle SQL Developer v3的SQL调优顾问为我的查询提供了以下建议:

考虑运行Access Advisor以改进物理模式 设计 或者创建推荐的索引如果选择创建 建议索引,考虑删除索引< /强> “SCHEMANAME”。“INDEXNAME”(在“COLUMN1”上),因为它是 推荐索引。

在SCHEMANAME.TABLENAME(“COLUMN1”、“COLUMN2”)上创建索引SCHEMANAME.NEW_INDEXNAME


不用粗体写建议有什么害处吗?问题是,它建议删除的现有索引被其他程序使用。我不认为idex会互相“伤害”,将这两个索引与它们将占用的磁盘空间分开,并且在插入/更新时性能会显著下降,这有什么坏处吗?

因此,假设旧索引在[Column1]上,而推荐索引在[Column1][Column2]上,建议的索引也可用于现有查询

简而言之:删除旧索引将如您所说,提高插入/更新的性能,也不会降低对使用旧索引的查询进行搜索的能力。推荐索引仍然允许搜索[Column1]值和[Column1][Column2]值


因此,除了更新/插入时的性能下降和额外的存储开销之外,没有什么坏处,但是维护这两个索引也没有什么好处。

不删除原始索引的坏处是Oracle在只需要一个索引时维护这两个索引的开销

离开他们的缺点是CRUD操作在您的工作台上的性能下降,我从您的帖子中了解到,目前这可能是“无关紧要的”,但工作台会随着时间的推移而增长,未来这可能会给您带来问题,然后必须进行补救

它也会不必要地占用更多的存储空间

您以前的过程也将能够使用新索引

留下不必要的索引将使未来的开发人员和DBA感到困惑,因为他们必须支持您的数据库,这将花费他们的时间和精力来调查重复索引存在的原因

与其寻找不放弃原始索引的理由,我还不如寻找保留原始索引的理由


放下它,测试你的“其他”过程的性能,你会发现几乎没有什么不同,如果有问题,你可以调查原因,如果有必要,可以更换它。

实际上,当你把索引放在单列上时,性能会下降

假设您使用
进行查询,其中[Column1]=123
。这可以用原始索引完美地解决。新索引也可用于此目的,但根据实现情况,即使未使用[Column2]的值,也需要读取索引中[Column2]的值

因此,是的:从理论上讲,删除索引可能有一个缺点:读取量增加

[9月9日更新]
最近我遇到了另一种情况,即单个索引可以比组合索引好得多。
考虑一个巨大的表“bug”栏[状态],[创建]和其他一些领域。大多数bug都将被关闭,因此假设100条记录的状态为“0”(打开),99000条记录的状态为“1”(关闭)

SELECT*FROM bug,其中status='0'
将从
status
上的索引中受益匪浅,而
SELECT*FROM bug,其中status='1'
上的索引将无济于事

Oracle将知道这一区别,因为它在索引上建立统计数据

但是,如果在
status上有一个组合索引,createdate
每个索引项几乎都是唯一的,Oracle将决定不使用该索引进行查询
SELECT*FROM bugs,其中status='0'
,因为它(错误地)猜测该索引没有帮助

因此,在这种情况下,不应该仅仅因为单个索引是组合索引的前缀就删除它


注意:从理论上讲,Oracle可以在索引上建立更智能的统计数据,但它似乎没有做到这一点。

+1但也许您也可以添加额外存储空间的缺点?马上!旧索引位于第1列。好吧,如果删除它不会损害column1上的过滤,那么为什么我们不总是为我们查询的所有列创建一个大的胖索引呢?@tsar数据索引以不同的数据结构创建数据副本(SQL Server中的B树,其他RDBMS中不确定)。如果是非聚集索引,它将只复制这些字段(在本例中为Column1/Column2),然后复制一个引用以在完整表中查找该记录的其余数据。聚集索引将整个数据集存储在附加数据结构中。这意味着在插入/更新时需要大量的数据开销和大量的处理来平衡数据结构。谢谢大家,我在这里找到了我的评论的答案:顺便说一句,在[Column1][Column2]上建立索引不会强制执行任何排序!只有ORDERBY语句才强制执行排序,其他任何内容都是巧合,可能会在Oracle的任何未来版本中发生更改!在任何Oracle文档中都有指向此的链接吗?预计会出现什么样的性能下降?我不知道任何文档,只知道我如何理解索引的工作原理。索引中有两列会使总索引加倍大。当索引具有很强的选择性(或唯一性)时,Oracle通常只需读取几个“块”即可获得所需的所有信息。当索引是两倍大时,它有可能需要读取更多的块。然而,我认为这种影响在所有实际情况下都可以忽略不计。我认为这是显而易见的,我很惊讶你没有得到更多的选票。如果您的索引更大,并且包含的信息不是eve