0

我有一個查詢(使用Oracle Application Express報告),我的用戶告訴我執行「緩慢」或以不可接受的速度執行(未給出實際加載時間頁面和查詢是頁面上唯一的東西)。使用流水線功能微調oracle查詢

該查詢涉及很多表,實際上引用了一個流水線函數,該函數標識當前登錄的用戶訪問我們的網站,並返回一個自定義的記錄「表」,他們有權根據我們的自定義安全方案進行記錄。

我的主要問題在於Oracle對查詢的緩存以及它們如何受到我們設置的影響。

當我將查詢從網頁中取出並在Sql Developer中運行(並手動指定用戶ID以模擬網站的登錄用戶)時,性能從71秒變爲19秒變爲.5秒。顯然,Oracle正在利用其緩存機制來加快後續運行。

這是怎麼受?:

  1. ,不同的用戶將獲得由 管內襯功能不同的表(所有相同的列,只是不同數量的 列,並在值的事實行)。管道阻止 緩存工作嗎?我只看到緩存,因爲我正在運行 一個非常孤立的測試?
  2. 更多 - 緩存是否容易受使用該系統的人數影響?我不知道如何「太多」可以獲得緩存。因此,如果我們有50個併發用戶訪問整個網站的不同部分,整天加載不同的查詢,那麼oracle可能無法緩存許多/任何一個用戶,因爲他們經常看到不同的請求疑問?

對不起,我的問題不是很技術性。

我是一位開發人員,他被要求在這個看似DBA的問題中提供幫助。

此外,這很複雜,因爲我們無法真正確定實際的加載時間是什麼,因爲我們的用戶沒有報告詳細程度。

任何思考:

  • 我怎麼能確定這個查詢實際上是慢?
  • 平均處理時間是多少?
  • 以及如何進行微調,如果它是一個問題?

謝謝!

回答

1

這聽起來不像是與APEX,流水線表函數或查詢緩存有什麼關係。這聽起來像是在描述普通舊數據緩存的效果(很可能在數據庫級別,但可能位於操作系統和磁盤子系統層)。

作爲一個非常基本的概述,數據被存儲在列,行存儲在塊(最常用的尺寸8 KB),塊存儲在盤區(通常幾MB的大小),並且區段捲起到段(即一張桌子)。 Oracle維護一個緩衝區緩存,其中存儲最近訪問過的塊。當您運行查詢時,Oracle會計算出需要讀取哪些數據塊以獲取數據(這是查詢計劃)。然後它會查看這些塊是否在緩衝區緩存中,或者是否必須從磁盤讀取它們。顯然,從緩存中讀取數據塊比從磁盤讀取數據更有效,因爲RAM比磁盤快得多。如果您連續多次使用同一組綁定變量值運行相同的查詢,則每次都會訪問同一組塊,但越來越多的您關心的塊將在緩存中。所以你通常會期望第二次和第三次你調用查詢,你會看到更快的性能。

如果使用一組不同的綁定變量值運行查詢,如果第二組綁定變量值導致Oracle訪問許多相同的塊,那麼這些執行將受益於先前測試緩存的數據。否則,你會回到原點1,從磁盤讀取所需的所有數據。很可能,你會看到兩者的一些組合。

請記住,它不僅僅是Oracle緩存數據。通常,操作系統將緩存底層Oracle數據文件中最活躍的部分。 I/O子系統也會緩存最近訪問過的數據。因此,即使Oracle認爲它需要出去獲取數據塊,因爲它不在數據庫的緩衝區高速緩存中,文件系統或I/O子系統可能已經高速緩存了該數據,因此它可能不需要實際的物理讀取磁盤。這些其他緩存行爲相似,如果連續多次運行相同的查詢,可能會導致緩存「變熱」並提高後續運行的性能。

+0

感謝您的詳細分解!從你的解釋,我同意它可能是數據緩存。你的第三段描述了我最有可能看到的東西。相同的查詢會每次運行多次,並使用不同的綁定值進行替換。流水線函數的每次運行都會「命中」相同的表,但只是根據您的身份返回更小或更大的數據子集。因此,據說,你能否推薦我如何進一步調查如何解決這個問題?研究學習解釋計劃?我只想確保我的用戶不會像我那樣體驗70秒的運行時間! – user3249281

+1

@ user3249281 - 很難做出真正一般的性能調整建議,這些建議特別有用 - 有很多「取決於」。第一步是弄清楚什麼是消耗時間(或者,如果我們認爲大部分時間都花在做I/O上,那是什麼導致了大部分邏輯I/O)。查看查詢計劃和執行統計數據可能會對此有所幫助。您也可以跟蹤會話,但查詢計劃可能是更簡單的起點。 –