4

我试图了解我在 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 做一些进一步的分析?

4

1 回答 1

4

“我知道默认情况下这只是获取前 50 行,但我至少可以确定 1.8 秒包含总执行时间加上将前 50 行交付给我的客户的时间吗?”

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

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

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

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

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

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

于 2009-12-22T03:59:42.003 回答