2014-03-05 156 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