将 SQL 查询转换为 PL/SQL 可以提高 Oracle 12c 中的性能吗? [关闭]

Posted

技术标签:

【中文标题】将 SQL 查询转换为 PL/SQL 可以提高 Oracle 12c 中的性能吗? [关闭]【英文标题】:Can converting a SQL query to PL/SQL improve performance in Oracle 12c? [closed] 【发布时间】:2018-01-22 12:14:03 【问题描述】:

我收到了一个 800 行的 SQL 查询,它需要大约 20 个小时才能获取大约 4 亿条记录。 有 13 个表按月分区。 这些表在每个分区中的记录范围从 10k 到 4 亿不等。 这些表在主键上建立索引。 该查询使用许多内联视图和外连接以及一些分组函数。

DBA 说我们不能添加更多索引,因为它是一个 OLTP 系统,这会降低性能。

我被要求将查询逻辑转换为 pl/sql,然后分块填充表。然后从该表中执行 select *。

我的最终结果应该是一个可以提供给我的应用程序的查询。 因此,即使在我使用 pl/sql 分块填充表之后,最终我还是需要从该表中获取数据作为查询。

我的问题是,既然 pl/sql 需要 select 和 insert 两者,那么 pl/sql 是否有可能比 sql 更快?

对于 sql 可实现的任何结果,是否存在 pl/sql 更快的情况?

如果给定的信息不充分,我很乐意提供更多信息。

【问题讨论】:

是的,有机会。基于集合的查询通常比定制代码更快,但肯定有例外。 聪明的钱是在一个 800 行的查询上,使用 “许多内联视图和外连接以及一些分组函数” 编写得很糟糕。明智的重写可能会产生巨大的性能改进。这是使用 PL/SQL 填充临时表的更好选择。但是,实际重写代码超出了本网站的范围。所以请不要问,除非你想支付一些咨询费用;) 【参考方案1】:

将其实现为存储过程可能会更快,因为在创建过程时 SQL 已经被解析和编译。但是,考虑到您所描述的数据量,不清楚这是否会产生重大影响。你所能做的就是试试看。

【讨论】:

【参考方案2】:

我认为您确实需要确定性能问题出在哪里;时间花在哪里。例如(我已经见过很多次这样的例子),大部分时间可能是在获取 400M 行到任何“客户端”。在这种情况下,重写查询或作为 PL/SQL 将没有任何区别。 无论如何,一旦你能列举出问题,你就有更好的机会得到正确的答案,而不是猜测......

【讨论】:

以上是关于将 SQL 查询转换为 PL/SQL 可以提高 Oracle 12c 中的性能吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何将 PL/SQL .sql 文件转换为 SQL*PLUS,以便它可以与 Windows 任务计划程序一起运行

将 PL/SQL 定义转换为 TSQL

PL / SQL将数字转换为文本[重复]

将 C# 代码转换为 PL/SQL 代码

将存储过程 PL/SQL 转换为 Java

PL/SQL 将字符串转换为布尔值