通过SQLDeveloper与应用程序的Oracle性能

时间:2009-12-22 03:12:42

标签: performance oracle oracle-sqldeveloper

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

当我在SQLDeveloper中按“执行查询”(F9)时,我写的查询在大约1.8秒内运行。我知道这只是默认获取前五十行,但我能否至少确定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参与进一步的分析?

1 个答案:

答案 0 :(得分:5)

  

“我知道这只是取而代之的   默认情况下前五十行,但我可以   至少可以肯定的是1.8   秒包括总数   执行时间加上时间   将前50行发送给我   客户端?“

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

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

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

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

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

向您的DBA咨询性能调整的快速教程。