Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何优化pl/SQL中较长的SQL语句?_Sql_Oracle_Plsql - Fatal编程技术网

如何优化pl/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中

我总是写很长的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中创建表。有更好的方法吗

Oracle的CHOOSE(软解析)能让许多sql语句执行得更快吗


多亏了经验分享。

它很少更快。你对优化器隐藏了你的意图。通常只提供一个查询,没有用户函数以获得最佳性能。

很少更快。你对优化器隐藏了你的意图。通常只给出一个没有用户函数的查询以获得最佳性能。

我非常喜欢将SQL作为一条语句编写。我发现这种方法更好,原因有很多:

  • 单个语句更易于维护
  • 我不必命名和记住中间表的名称
  • 当逻辑发生变化时,我可能会犯错误,而不会重新构建中间结果
  • 优化器很有可能获得正确的执行计划
也就是说,优化器并不总是正确的。Oracle有一个很好的优化器,它利用了统计数据。有时,在某些情况下,将复杂查询分成若干部分可以提高性能:

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

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

我非常喜欢将SQL作为一条语句编写。我发现这种方法更好,原因有很多:

  • 单个语句更易于维护
  • 我不必命名和记住中间表的名称
  • 当逻辑发生变化时,我可能会犯错误,而不会重新构建中间结果
  • 优化器很有可能获得正确的执行计划
也就是说,优化器并不总是正确的。Oracle有一个很好的优化器,它利用了统计数据。有时,在某些情况下,将复杂查询分成若干部分可以提高性能:

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

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

它不一定会更快,因为两者都在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