使用索引加速子<>父查询

Using index to speed up child <> parent query

我有类似的查询:

select *
from table1
where status = 'ACTV'
and child_id <> parent_id

问题是这个 table 相当大,Oracle 正在进行完整的 table 扫描。 我试图创建一个索引(具有状态、child_id、parent_id 列)来加速此查询,但 Oracle 即使有提示也没有使用此索引。

有没有办法加快这个查询的速度?

您可以将索引与函数一起使用:

CREATE INDEX child_parent ON table1(DECODE(child_id,parent_id,1, 0))

然后在你的select中使用它:

select *
from table1
where status = 'ACTV'
  and DECODE(child_id,parent_id,1, 0) = 0

此解决方案的唯一缺点 - 与常规索引相比,它会稍微减慢插入和更新操作的速度。 此外,如果可能返回的记录数很大,Oracle 可以进行 table 全面扫描

在父子中 table :"child_id <> parent_id" 显然是正确的,它总是会获取 99% 的数据然后完整 table 扫描是更好的方法。如果您选择更多的数据百分比,索引会变慢。

如果您的应用程序总是需要 "child_id <> parent_id",那么您可以为其创建检查约束。那么你可能在任何时候都不需要这个 where 条件 "child_id <> parent_id"。