如何在pl / sql中优化更长的SQL语句?

时间:2016-03-02 01:31:04

标签: sql oracle plsql

我总是写很长的sql,但是为了以后的维护。 一个sql语句分成多个语句更好吗? 例如:

select a.a1, a.a2, b.b3, sum(c.c4), b.b4...b.bn
from A a
inner join B b on a.a1=b.b1
left join C c on a.a2=c.c2
group by a.a1, a.a2, b.b3, b.b4,...,b.bn

我分为

create temp_table select a.a1, a.a2, sum(c.c4)
from A a
left join C c on a.a2=c.c2
group by a.a1, a.a2

select temp.*, b.b3, b.b4,...b.bn
from temp_table temp
inner join B b on temp.a1=b.b1

但它需要在pl / sql中创建表。有更好的方法吗?

Oracle的CHOOSE(软解析)能否更快地执行许多sql语句?

感谢经验分享。

3 个答案:

答案 0 :(得分:3)

我喜欢将SQL编写为单个语句。我发现这种方法更好的原因有多种:

  • 单个陈述更容易维护。
  • 我不必命名并记住中间表名称。
  • 当逻辑发生变化时,我可能会犯错,不会重新构建中间结果。
  • 优化器很有可能获得正确的执行计划。

那就是说,优化器并不总是正确的。 Oracle有一个很好的优化器和一个利用统计数据的优化器。有时,在某些情况下,将复杂查询分成几部分可以​​提高性能:

  • 优化器无法很好地估算中间结果的大小。表“确切地”知道它有多少行。
  • 您可以将索引添加到中间表。
  • 您希望重复使用结果,例如进行查询间优化。

虽然这些可能是有益的,但我自己因为复杂性和可维护性而回避。但是,它有时会更快。

答案 1 :(得分:1)

它很快就会更快。您正在从优化程序中隐藏您的意图。通常给它一个查询,没有用户功能以获得最佳性能。

答案 2 :(得分:0)

它不一定更快,因为它们都在Oracle服务器上运行,并且无论如何都会编译PL / SQL。

如果您通过一个SQL完成所有操作,则将查询优化留给Oracle,而如果编写自己的PL / SQL,则可以更好地控制查询的执行方式。但是如果你写的PL / SQL不好,那肯定会表现得更差。

但是,我不确定破解代码真的能提高可维护性。除非你说你可以在其他地方重用破碎的部分,这可以提高代码的重用率,我认为将它作为一个单一的陈述似乎更合乎逻辑。你绝对可以添加更多的评论来解释尽可能详细的细节,以便将来对谁进行阅读。