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

时间:2015-04-24 11:54:02

标签: oracle indexing full-table-scan

我的查询类似于:

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

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

有没有办法加快查询速度?

2 个答案:

答案 0 :(得分: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可以执行表全扫描

答案 1 :(得分:0)

在父表,子表中:“child_id&lt;&gt; parent_id”显而易见,它总是会获取99%的数据,然后全表扫描是更好的方法。如果您选择更多百分比的数据,索引会更慢。

如果您的应用程序需要“child_id&lt;&gt; parent_id”,那么您可以创建相同的检查约束。那么你可能不需要随时使用条件“child_id&lt;&gt; parent_id”。

相关问题