Oracle 选择查询优化

Posted

技术标签:

【中文标题】Oracle 选择查询优化【英文标题】:Oracle Select Query optimization 【发布时间】:2013-09-01 11:50:15 【问题描述】:

我正在对我的数据执行一些 sql 语句,我有以下情况。

Select 语句如下所示

select *
from t1, t2
where t1.id = t2.t1_id
t1.c1 = 'X' and t1.c2  in ('Y', 'Z')

运行解释计划,我看到 col2 过滤的成本为 11(带有过滤谓词的表访问)和 col1 1(表访问索引)。

如何降低在 col2 上的搜索成本?我应该在查询中添加任何提示吗?

提前致谢,

【问题讨论】:

请将解释计划粘贴到问题中。 ...以及真正的查询。 【参考方案1】:

我更喜欢查询的 ANSI 语法:

select *
from t1 join
     t2
     on t1.id = t2.t1_id
where t1.c1 = 'X' and t1.c2  in ('Y', 'Z');

考虑在t1(c1, c2, id)t2(t1_id) 上建立索引。第一个索引应该用于从t1 获取行。第二个应该加快加入t2

编辑:

根据 David 的评论,t1(c1, c2) 上的索引可能会稍微好一些。

【讨论】:

通过 select * 从两个表中获取所有列,我认为 t1 上的索引也可能是 (c1, c2)。 @DavidAldridge 。 . .这是一个有趣的观点。有可能(但我不知道)使用索引中的id,单独的索引将用于连接,稍后会出现其他列。但是,Oracle 可能会先获取页面,然后再进行连接。 我很确定它会首先访问表索引,COMPRESS 也可能有用。

以上是关于Oracle 选择查询优化的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 选择查询优化

优化插入选择查询Oracle

如何使用大量和语句优化 Oracle 查询

Oracle 子查询优化思路

oracle sql查询进一步优化1

SQL性能优化(Oracle)