2014-03-05 152 views
6

我是Oracle DB的初学者。 我想知道查询的执行时间。该查询返回大约20,000条记录。 当我看到SQL Developer中,它只显示50行,最大tweakable到500并采用F5高达5000查找使用SQL Developer查询的执行时间

我会通过在应用程序的变化都做了,但因为它正在运行的应用程序重新部署是不可能的在生产上。 所以,我仅限于使用SQL Developer。我不确定如何获得执行查询所用的秒数? 任何想法都可以帮助我。 谢谢。

问候, JE

回答

4

如果你的语句是已部署应用程序的一部分,如果你有权限访问视图V$SQLAREA,你可以检查的EXECUTIONSCPU_TIME号。您可以搜索使用SQL_TEXT声明:

SELECT CPU_TIME, EXECUTIONS 
    FROM V$SQLAREA 
WHERE UPPER (SQL_TEXT) LIKE 'SELECT ... FROM ... %'; 

这是为了确定实际运行时间最精确的方法。观点V$SESSION_LONGOPS也许对你很有意思。

如果您无权访问这些视图,则还可以使用游标循环遍历所有记录,例如,

CREATE OR REPLACE PROCEDURE speedtest AS 
    count number; 

    cursor c_cursor is 
    SELECT ...; 
BEGIN 
    -- fetch start time stamp here 
    count := 0; 

    FOR rec in c_cursor 
    LOOP 
    count := count +1; 
    END LOOP; 
    -- fetch end time stamp here 
END; 

根据各自的体系,这可能是或多或少准确的,因为数据可能需要被传输到您的SQL所运行的系统。

+0

该过程将在服务器上的数据库中运行,而不在客户端中运行;所以光标不会有任何数据传输? –

+0

@亚历克斯:谢谢你的提示,是的,你一般都是对的。除非通过数据库链接未选择数据 - 在这种情况下可能会产生影响。 – Trinimon

+0

@Trinimon Well对我不起作用我得到:01031. 00000 - “权限不足” –

2

您可以更改这些限制;但是您将在数据库和客户端之间的数据传输中使用一些时间,并且可能会用于显示;而这又会受到每次获取所拉动的行数的影响。这些东西也影响你的应用程序,所以看着原始的执行时间可能无法告诉你整个故事。

要更改工作表(F5)限制,请转到工具 - >首选项 - >数据库 - >工作表,并增加'在脚本中打印的最大行数'值(也可能是'脚本输出中的最大行数') 。要更改获取大小,请转至首选项中的“数据库” - >“高级”面板;可能会匹配您的应用程序的价值。

这不是完美的,但如果你不希望看到实际的数据,只是得到它需要在数据库运行的时候,你可以用查询得到的单行:

select count(*) from (
    <your original query 
); 

它通常会执行整个原始查询,然后对结果进行计数,结果将不会添加任何重要的时间。 (这是可行的,它可能在内部重写查询,但我认为这不太可能,并且如果需要,可以使用提示来避免它)。

+0

我也考虑过这种方法,并想知道这是否足够准确,特别是像'FIRST_ROWS'或'ALL_ROWS'这样的潜在查询提示。我可以想到结果可能会有很大差异的例子。无论如何,这是至少一个简单的解决方案,应该在任何情况下工作:) – Trinimon

+0

@Trinimon - 部分取决于你需要的准确度以及是否需要考虑数据传输时间。如果您正在查看性能问题,那么无论如何,您的应用程序的获取大小和数据传输速率可能会使查询执行时间变得更加糟糕。 –

12

如果向下滚动到最初返回的50行,它会获取更多。当我想要所有人时,我只需点击50中的第一个,然后按Ctrl结束一直滚动到底部。

这将更新所使用时间的显示(仅在结果上方会显示“所有行获取:3.006秒内20000”),为您提供完整查询的准确时间。

+1

+1对SQL Developer新用户有用的提示(像我一样)。在万行的情况下, – condiosluzverde

+0

需要大量的卷轴 – Akki