我试图了解我在 Oracle 中编写的查询的性能。此时我只能访问 SQLDeveloper 及其执行计时器。我可以运行 SHOW PLAN 但不能使用自动跟踪功能。

当我在 SQLDeveloper 中按“执行查询”(F9) 时,我编写的查询在大约 1.8 秒内运行。我知道默认情况下这只会获取前 50 行,但我能否至少确定 1.8 秒包含总执行时间加上将前 50 行交付给我的客户的时间?

当我将此查询包装在存储过程中(通过 OUT REF CURSOR 返回结果)并尝试从外部应用程序 (SQL Server Reporting Services) 使用它时,该查询需要超过一分钟才能运行。当我在 SQLDeveloper 中按“运行脚本”(F5)时,我得到了类似的性能。似乎这里的区别在于,在这两种情况下,Oracle 必须将所有行发回,而不是前 50 行。这让我相信客户端 PC 和 Oracle 实例之间存在一些网络连接问题。

我的查询只返回大约 8000 行,所以这个性能令人惊讶。为了证明我上面关于延迟的理论,我在 SQLDeveloper 中运行了一些这样的代码:

declare
    tmp sys_refcursor;
begin
   my_proc(null, null, null, tmp);
end;

......这会在大约两秒钟内运行。同样,SQLDeveloper 的执行时钟是否准确地指示了查询的执行时间?或者我是否遗漏了什么,是否有可能实际上是我的查询需要调整?

任何人都可以根据我可用的有限工具向我提供有关此的任何见解吗?或者我应该尝试让 DBA 做一些进一步的分析?

最佳答案



不,是时候返回前 50 行了。不一定要求数据库已经确定了整个结果集。

将表格视为百科全书。如果您想要一个名称以“A”或“Z”开头的动物列表,您可能很快就会得到 Aardvarks 和 Alligators。获得 Zebras 需要更长的时间,因为您必须阅读整本书。如果您的查询正在执行全表扫描,则在它读取整个表(或书)之前它不会完成,即使在第一章之后没有任何内容可供选择(因为它不知道那里在它阅读它之前,那里没有任何重要的东西)。

declare
    tmp sys_refcursor;
begin
   my_proc(null, null, null, tmp);
end;

这段代码什么都不做。更具体地说,它将解析查询以确定必要的表、列和权限是否到位。它不会实际执行查询或确定是否有任何行符合过滤条件。

如果查询只返回 8000 行,则网络不太可能是一个重大问题(除非它们是非常大的行)。

向您的 DBA 索取性能调优的快速教程。

关于performance - 通过 SQLDeveloper 与应用程序实现的 Oracle 性能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1943955/

10-12 20:37