提示 oracle 在子查询上使用索引——Oracle SQl

Posted

技术标签:

【中文标题】提示 oracle 在子查询上使用索引——Oracle SQl【英文标题】:Hint oracle to use indexes on the subquery -- Oracle SQl 【发布时间】:2011-08-17 19:41:20 【问题描述】:

我有一个查询如下

select *
from
( select id,sum(amt) amt from table_t group by id
) t inner join table_v v on (v.id = t.id)
order by t.amt desc;

table_t 没有索引,有 738,000 行,table_v 在 id 上有索引,有 158,000 行。

查询当前在 10 秒内获取结果。

explain 查询计划显示全表扫描。我怎样才能提高这里的性能?

如果我在 table_t 的 id 上添加索引会有帮助。因为我在子查询中使用它?

【问题讨论】:

【参考方案1】:

如果您在(id,amt) 上有一个索引,您将最小化分组/求和过程中的工作(因为它可以读取索引)。如果两列都可以为空,那么您可能需要添加“其中 id 不为空”,以便它使用索引。 [后面加入 id 暗示了这一点,但优化器可能无法推断出来。]

下一步将使用物化视图进行汇总,可能在(amt,id) 上使用索引(它可以用来避免排序)。但这会在提交或请求时或按计划的时间间隔刷新。如果您需要将此查询作为事务的一部分进行,这将无济于事。

索引和物化视图都会为表上的插入/更新/删除添加工作,但在此查询中保存工作。

【讨论】:

以上是关于提示 oracle 在子查询上使用索引——Oracle SQl的主要内容,如果未能解决你的问题,请参考以下文章

oracle 索引失效原因_汇总

Oracle外键需要建索引吗?

微软的mssql有没有象oracle一样的强制索引,如何使用?

Oracle 优化器不接受索引提示

MySQL 未在子查询中使用 INDEX

Oracle索引HINT的使用