我想明白,我已经写在Oracle中的查询性能。在这个时候,我只能访问的SQLDeveloper和其执行定时器。我可以运行SHOW计划,但不能使用自动跟踪功能。

这我已经写在运行约1.8秒的时候我按下“执行查询”(F9)中的SQLDeveloper查询。我知道,这只是取前五十个行默认,但我至少可以肯定的是,1.8秒涵盖的总执行时间以及交付第50行到我的客户?时间

当我包裹在存储过程中该查询(返回经由OUT REF CURSOR结果),并尝试从外部应用程序(SQL Server报告服务),查询采用在一分钟内运行使用它。我得到类似的性能,当我按下“运行脚本”(F5)中的SQLDeveloper。看来,这里的区别是,在这两种情况下,Oracle必须传输的所有行的后面,而不是第50。这使我相信,有客户端PC和Oracle实例之间的一些网络连接问题。

我的查询只所以这样的表现是令人惊讶的返回约8000行。为了试图证明上述关于延迟我的理论,我跑了一些像这样的代码中的SQLDeveloper:

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

...而这个运行在大约两秒钟。同样,没有的SQLDeveloper的执行时钟精确指示查询的执行时间?还是我失去了一些东西,是有可能,它实际上是我的查询需要哪些调整?

任何人都可以请您提供基于有限的工具,我可以在这个任何见解?或者我应该尝试涉及DBA做一些进一步的分析?

有帮助吗?

解决方案

  

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

没有,则返回第50行的时间。这不一定要求数据库已经确定整个结果集。

想一想表作为百科全书。如果你想要的动物与“A”或“Z”开头的名称列表,你可能会得到土豚和短吻鳄很快。这将需要更长的时间才能得到斑马因为你必须阅读整本书。如果您的查询是做一个全表扫描,它不会完成,直到它读取整个表(或书),即使有什么可以在任何的第一章后(拾起,因为它不知道有是没有什么在那里重要,直到它读它)。

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

这一段代码不执行任何操作。更具体地讲,它会解析查询,以确定必要的表,列和权限到位。它实际上不会执行查询或确定任何行是否满足过滤器条件。

如果查询只返回8000行这是不可能的,网络是一个显著的问题(除非他们是非常大的行)。

问问你的DBA在性能调整的快速教程。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top