如何优化pl/SQL中较长的SQL语句?
我总是写很长的sql,但为了以后的维护。 一条sql语句分为多条语句更好吗? 例如: 我分为如何优化pl/SQL中较长的SQL语句?,sql,oracle,plsql,Sql,Oracle,Plsql,我总是写很长的sql,但为了以后的维护。 一条sql语句分为多条语句更好吗? 例如: 我分为 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中
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语句执行得更快吗
多亏了经验分享。它很少更快。你对优化器隐藏了你的意图。通常只提供一个查询,没有用户函数以获得最佳性能。很少更快。你对优化器隐藏了你的意图。通常只给出一个没有用户函数的查询以获得最佳性能。我非常喜欢将SQL作为一条语句编写。我发现这种方法更好,原因有很多:
- 单个语句更易于维护
- 我不必命名和记住中间表的名称
- 当逻辑发生变化时,我可能会犯错误,而不会重新构建中间结果
- 优化器很有可能获得正确的执行计划
- 优化器无法很好地估计中间结果的大小。表“知道”它有多少行
- 您可以向中间表添加索引
- 您希望重用结果,例如用于查询间优化
虽然这些可能是有益的,但我自己也因为复杂性和可维护性而回避。但是,它有时会更快。我非常喜欢将SQL作为一条语句编写。我发现这种方法更好,原因有很多:
- 单个语句更易于维护
- 我不必命名和记住中间表的名称
- 当逻辑发生变化时,我可能会犯错误,而不会重新构建中间结果
- 优化器很有可能获得正确的执行计划
- 优化器无法很好地估计中间结果的大小。表“知道”它有多少行
- 您可以向中间表添加索引
- 您希望重用结果,例如用于查询间优化
虽然这些可能是有益的,但我自己也因为复杂性和可维护性而回避。但是,它有时会更快。它不一定会更快,因为两者都在Oracle server上运行,而且您的PL/SQL也将被编译 如果所有的事情都由一个SQL完成,那么查询优化就交给Oracle来完成,而如果编写自己的PL/SQL,则可以更好地控制查询的执行方式。但是,如果您编写的PL/SQL不好,它的性能肯定会更差
然而,我不确定分解代码是否真的能提高可维护性。除非你说你可以在其他地方重用这些碎片,这可以提高代码的重用性,否则我认为只使用一条语句似乎更符合逻辑。您当然可以添加更多注释,尽可能详细地解释,以便将来阅读它的人清楚地了解它。这不一定会更快,因为两者都在Oracle server上运行,而且您的PL/SQL也将被编译 如果所有的事情都由一个SQL完成,那么查询优化就交给Oracle来完成,而如果编写自己的PL/SQL,则可以更好地控制查询的执行方式。但是,如果您编写的PL/SQL不好,它的性能肯定会更差
然而,我不确定分解代码是否真的能提高可维护性。除非你说你可以在其他地方重用这些碎片,这可以提高代码的重用性,否则我认为只使用一条语句似乎更符合逻辑。您当然可以添加更多的注释,尽可能详细地解释,以便将来阅读它的人清楚地了解它。我想优化更长的SQL语句,以便在以后的时间段进行维护或更改。所以我想对其进行划分。啊,好的。我建议你们雇佣懂SQL的人,他们不会被基本的问题弄糊涂。我想优化更长的SQL语句,以便在以后的时间里维护或修改。所以我想分一下。啊,好的。我建议你雇用懂SQL的人,他们不会被基本知识所迷惑。
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