【问题标题】:Using index to speed up child <> parent query使用索引加速子 <> 父查询
【发布时间】:2015-04-24 11:54:01
【问题描述】:

我有类似的查询:

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

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

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

【问题讨论】:

    标签: oracle indexing full-table-scan


    【解决方案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 可以进行全表扫描

    【讨论】:

    • 感谢您提供信息。该表已经有很少的索引,使用 DECODE 允许使用 DECODE 和状态列作为数据过滤器进行 INDEX SKIP SCAN。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-08-31
      • 2014-02-13
      • 2018-11-30
      • 1970-01-01
      • 2014-03-17
      • 2015-12-22
      • 2011-04-24
      • 2010-12-07
      • 2012-05-24
      相关资源
      最近更新 更多