通過將表放置在虛擬 RAM 磁碟上來提高性能
我試圖通過將表放在虛擬 RAM 磁碟中來提高查詢的性能。我在 Oracle 11.2 標準版中使用 4G 的 SGA 和 2G 的 PGA。
我使用 imdisk 創建了一個大小為 140GB 的虛擬 RAM 磁碟。然後,我只將一張具有 3.5 億行和 32GB 大小的表移動到此 RAM DISK。
現在我正在使用簡單的直接查詢訪問此表。
SELECT PRICE, QUANTITY FROM TEST_TABLE;
閱讀整個表格大約需要 5-6 分鐘。
無論表是在硬碟 (SSD) 還是 RAM 磁碟中,性能都沒有差異。當 RAM 讀取速度比硬碟快很多倍時,為什麼這在查詢性能上沒有體現出來呢?
這裡有什麼遺漏嗎?
任何幫助,將不勝感激。
解釋計劃 計劃雜湊值:2982911821
------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 348M| 11G| 1311K (2)| 04:22:14 | | 1 | TABLE ACCESS FULL| TEST_TABLE | 348M| 11G| 1311K (2)| 04:22:14 | --------------------------------------------------------------------------------
這是統計數據的輸出:
| Id | Operation| Name| Starts | E-Rows | A-Rows |A-Time|Buffers| |0 | SELECT STATEMENT| |1 | | 13 |00:00:00.04 | 4 | | 1 | COLLECTION ITERATOR PICKLER FETCH| DISPLAY_CURSOR | 1 | 136 | 13 |00:00:00.04 | 4 |
我在這裡嘗試看看 RAM 磁碟是否真的可以提高性能,因為這是全表掃描並且它已經獲取了很多行,我認為這將是 RAM 磁碟與 Oracle 的影響的合適案例。
如果可以在 RAM 中移動表,那麼我們計劃將整個數據庫保留在 RAM 中(我們的數據庫大小為 500GB),這樣我們就可以避免 I/O 瓶頸或 I/O 限制,我們還要確保我們有最好的硬體來處理 I/O 限制,沒有什麼可以為 I/O 做更多的事情了。現在我只關注 I/O 成本,並認為將表移動到 RAM 將解決這些問題。
此外,我們已經有一種機制來處理 RAM 的波動性,所以這對我來說現在不是問題。此外,整個數據庫都在 SSD 中(我們仍然對性能不滿意)。必須從 RAM 中獲取數據,而不是從 SSD 中獲取數據。我無法得到答案的唯一問題是為什麼這裡沒有反映出來(即使範例查詢是 I/O 綁定的)。這是我正在做的一個練習,目的是在使用 RAM 和微調其他查詢方面做出一些重要決定。
當您可以增加 SGA、增加緩衝區記憶體、定義 KEEP 池、使用支持的內置工具時,為什麼還要為 RAM 磁碟煩惱?
為什麼要對數據庫撒謊,讓它認為它使用了磁碟並執行了所有相關的額外不必要的操作,而它間接地無效地使用了記憶體?
為什麼使用記憶體作為“持久”儲存來冒數據庫損壞和失去數據的風險?
是什麼讓您認為數據庫工作了 5-6 分鐘?你檢查過數據庫真正做了什麼嗎?
即使數據庫在 20 秒內讀取整個表,獲取和顯示 3.5 億行也需要更多時間。人們通常認為掛鐘時間 = 執行時間,但事實並非如此。
忘記解釋計劃,這只是一個假設。至少,請檢查以下內容:
alter session set statistics_level=all; SELECT PRICE, QUANTITY FROM TEST_TABLE; select * from table(dbms_xplan.display_cursor(format=>'allstats last'));
為這兩個測試執行上述程式碼,並比較結果。
或者啟用 SQL 跟踪。至少檢查測試之間的“磁碟 I/O”統計資訊。測量你的測試。
虛擬 RAM 磁碟(使用主記憶體創建)當然是易變的。儲存在 RAM Disk 中的表在重新啟動之間不是持久的。在這種情況下,您可能會在斷電或異常關機時失去數據。為了使您的數據持久化,您必須將數據從 RAM Disk 寫入持久性儲存,並且在載入時應注意將數據從持久性儲存載入到 RAM Disk,這會增加額外的成本。
那麼,為什麼要使用 RAM Disk?
我想獲得 I/O 速度,但你不能擺脫所涉及的 I/O 數量——這意味著你不能通過使用 RAM Disk 來減少物理讀取的數量。您可以改為使用索引並定義更大的緩衝區高速記憶體來減少此類物理 I/O。然後意圖應該是增加邏輯 I/O 而不是物理。
閱讀整個表格大約需要 5-6 分鐘…
該查詢返回數百萬行大小為 11G,您無法通過使用 RAM Disk 來減少它。獲得 I/O 性能的更好選擇是 SSD IMO。