Oracle SQLDeveloper与应用程序相比的性能差异

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进行进一步的分析?


1
如果您能发布查询、相关表格、索引等的描述以及执行计划,那将非常有帮助。 - Bob Jarvis - Слава Україні
1个回答

4
“我知道默认情况下只获取了前50行数据,但我能不能确定1.8秒包括了整个执行过程以及向客户端发送前50行数据的时间?”
不是的,它只是返回前50行数据的时间。这并不一定要求数据库已经确定了整个结果集。
可以将表格想象成一本百科全书。如果你要列出以'A'或'Z'开头的动物名称,你很快就能得到“Aardvarks”和“Alligators”的信息。但是如果你要找斑马的话,需要阅读整本书才能找到。如果查询正在进行全表扫描,即使在第一章之后没有什么重要的信息可供提取(因为它不知道那里没有重要的信息,除非它已经读过),它也无法完成查询,直到读完整张表(或整本书)。
declare
    tmp sys_refcursor;
begin
   my_proc(null, null, null, tmp);
end;

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

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

请向您的数据库管理员询问有关性能调优的快速教程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接