2014-04-11 29 views
3

我在這裏丟失了什麼?我試圖測試識別長時間運行的查詢。Oracle - 無法找到長時間運行的查詢

我有一個約4億行測試表mytest。 我在sqlplus

select * from mytest在另一個窗口,我跑到下面的腳本,看看我的長時間運行的查詢

select s.username, s.sid, s.serial#, s.schemaname, 
    s.program, s.osuser, s.status, s.last_call_et 
    from v$session s 
where last_call_et >= 1 – this is just for testing 

我的長時間運行的查詢不從上面的查詢結果顯示出來。如果我將條件更改爲> = 0,那麼儘管查詢仍在運行,但我發現查詢顯示狀態爲INACTIVE且last_call_et爲0。我能做些什麼來查看上面的長時間運行的查詢,如上面的select * from...,以便我可以殺死它?

感謝

回答

1

首先,你需要了解什麼樣的select * from mytest查詢確實是在做幕後,因爲這通常不會是一個長時間運行的查詢。 Oracle不需要實現該結果集,也不會因爲一次調用就讀取所有數據。相反,發生的是一系列調用,每個調用都會導致Oracle執行一些工作。談話就像這樣。

  • 客戶:嘿甲骨文,運行查詢對我來說:select * from mytest
  • 甲骨文:當然(last_call_et重置爲0,以反映新的呼叫開始)。我已經生成了一個查詢計劃並打開了一個光標, 這裏是一個句柄(注意,沒有工作已經完成,但實際上 執行查詢)
  • 客戶端:很酷,謝謝。 Oracle使用這個光標句柄, 可以取我下50行(取指大小是客戶端設置)。
  • Oracle:將會執行(last_call_et重置爲0以反映新的調用已啓動)。我開始全面掃描桌子,閱讀幾塊 塊,並獲得50行。幹得好。
  • 客戶:好的,我已經處理了 那些。使用此光標句柄,獲取下一個50行
  • 重複,直到所有的數據被取出

在這個過程中沒有一點是Oracle曾經真正被要求做更多的讀取的塊極少數獲得50行(或任何客戶請求的讀取大小)。在任何時候,客戶都可以簡單地不要求下一批數據,所以Oracle不需要長時間運行。 Oracle不會追蹤更多數據請求之間的應用程序思考時間 - 它不知道客戶端是一個處於緊密循環中的GUI獲取數據,還是將結果顯示給人類並等待人類點擊「下一步」按鈕。絕大多數時間,會話將是INACTIVE,因爲它主要是等待客戶端請求下一批數據(在格式化最後一批數據進行顯示並完成之後,它通常不會執行此操作努力顯示它)。

當大多數人談論一個長期運行的查詢時,他們正在討論Oracle正在積極處理相對較長時間的查詢,而無需等待客戶端來獲取數據。

+0

Coool解釋賈斯汀! –

+0

非常感謝您的回覆。這非常有幫助。 – user3524242

+0

嗨,賈斯汀,再一次感謝你的迴應,並解釋了Oracle如何處理select * from查詢。我有一個問題是爲什麼v $ session將last_call_et顯示爲零? – user3524242