使用索引加速子<>父查询
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"。
我有类似的查询:
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"。