2009-12-22 37 views
4

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

当我在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

如果您可以发布查询,相关表格,索引等的描述以及执行计划,这将会很有帮助。 – 2009-12-22 03:37:55

回答

5

“我知道,这只是取了 前五排在默认情况下,但我 至少可以肯定的是,1.8 秒涵盖的总 执行时间加上时间 交付第50行到我的 客户端?“

不,现在是返回前50行的时间。它不一定要求数据库确定整个结果集。

把桌子想象成百科全书。如果你想要一个名字以'A'或'Z'开头的动物列表,你很可能会很快得到Aardvarks和Alligator。获得斑马需要更长的时间,因为你必须阅读整本书。如果您的查询正在进行全表扫描,即使在第一章之后没有任何东西需要拾取(因为它不知道那里有任何内容),它在读取整个表(或书)之前不会完成在阅读它之前在那里并不重要)。

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

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

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

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

相关问题