1

我有类似这样的查询:

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

问题是这个表非常大,Oracle 正在进行全表扫描。我试图创建一个索引(带有 status、child_id、parent_id 列)来加速这个查询,但是 Oracle 没有使用这个索引,即使有提示。

有没有办法加快这个查询?

4

2 回答 2

1

您可以将索引与功能一起使用:

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

然后在您的选择中使用它:

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

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

于 2015-04-24T11:59:35.300 回答
0

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

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

于 2015-04-25T17:13:07.997 回答