Java

探索和優化系統(PostgreSQL 和 Hibernate)的 SQL 性能?

  • April 4, 2013

想像一下,您繼承了一些廣泛使用 SQL 查詢的項目。

讓我們假設 Hibernate 用作 ORM 而 PostgreSQL 用作數據庫,但這不是重點。

一個問題是:您能否建議一個計劃來順序掃描系統並優化 SQL 查詢性能?

我建議該計劃的以下步驟:

  1. 檢查哪些查詢執行時間最長 -我們如何在 PostgreSQL 中執行此操作
  2. 檢查哪些查詢最常執行 -我們如何在 PostgreSQL中執行此操作?
  3. 找出哪些查詢沒有使用索引——我們如何在 PostgreSQL 中做到這一點
  4. 找出連接池是否在沒有任何延遲的情況下執行 -我們如何在 PostgreSQL 中做到這一點
  5. 檢查 Hibernate 的記憶體使用情況:是否記憶體了前兩點的查詢?-我們如何在 Hibernate 中做到這一點?
  6. 哪些查詢傾向於訪問數據庫而不是訪問記憶體 -我們如何在 Hibernate 中做到這一點?

請提出您自己的選擇。

可能有一些軟體可以推薦這個任務嗎?

可能還有其他一些數據庫參數需要檢查、記錄、繪圖以監控?

以下是我能想到的更多檢查:

  • 檢查是否啟用了 PostgreSQL 準備語句使用。
  • 如果您有一個包含許多元素的表,請檢查其中一些是否可以“移動”到另一個歸檔項目表。(例如,一個返回過去 7 天交易的查詢)
  • 檢查您是否不僅使用了一級記憶體,還使用了二級記憶體。也許使用 ehcache 或 infinispan。那些可以記憶體許多對象,甚至將一些對象持久化到磁碟。您必須確保其他執行緒中的修改會使這些對象無效。這也取決於您使用的事務隔離。
  • 如果您有隻讀的實體(它們永遠不會被修改),您可以考慮將所有這些實體作為 java 對象載入到記憶體中。然後你可以減少一些連接。
  • 對於您的實體,如果您對另一個對像有依賴關係,您可以將其 ID 保存在您的實體欄位中。然後,當您載入對象時,它不會進行連接。
  • 與上一點相關,您還可以使用延遲載入實體。
  • 使用 P6Spy 或類似的庫來了解查詢需要多長時間。

引用自:https://dba.stackexchange.com/questions/39259