oracle查询中的“WITH”子句优化

Posted

技术标签:

【中文标题】oracle查询中的“WITH”子句优化【英文标题】:"WITH" clause optimization in oracle query 【发布时间】:2012-02-28 10:21:05 【问题描述】:

当我在查询中使用许多 WITH 子句时,它执行的时间更长,而不是没有它。 查询结构如下:

with t1 as (select some_fields from table1 inner join table2),
     t2 as (select some_fields from t1 inner join table3),
     t3 as (select some_fields from t2 inner join table4)
select * from t3

应该使用什么方法来优化类似查询? 在我的例子中,每个子查询返回大约 1000 万行。

【问题讨论】:

这取决于查询!为了支持您,请发布您的查询!如果您有不同版本的查询(带有和不带有 WITH 子句),请全部发布! 你有什么替代这个更快的语句?请问也可以发一下吗!通常对于 Oracle 数据库,如果您使用 WITHclause 没有区别! 我不能按照政策来做(。谢谢,试着了解自己 为什么不在这些表之间进行连接呢?对于您的示例: select some_fields from t2 inner join table4 【参考方案1】:

由于涉及到所有保密问题,我建议您查看EXPLAIN PLAN 的两个查询。在我看来,WITH 只不过是允许您在子查询中重用某些 sql 的语法糖。但总而言之,它并不总是导致最有效的计划。

是的,10 000 000 总是很慢。

【讨论】:

【参考方案2】:

我确认 WITH CLAUSE 不会提高 Oracle 数据库的性能。 它只允许使用查询名称而不是整个查询文本的重复。

此外,它还允许定义 PL/SQL 函数,以便随后在查询中使用。

【讨论】:

以上是关于oracle查询中的“WITH”子句优化的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE 11G 中的 WITH 子句使用 UNION ALL

在 Oracle 中使用 connect by 在 with 子句中访问子查询中的父别名

Oracle WITH 子句不返回数据

如何在where子句中使用max优化Oracle中的查询

Oracle查询性能优化

Oracle 查询性能优化(转)