Java
探索和優化系統(PostgreSQL 和 Hibernate)的 SQL 性能?
想像一下,您繼承了一些廣泛使用 SQL 查詢的項目。
讓我們假設 Hibernate 用作 ORM 而 PostgreSQL 用作數據庫,但這不是重點。
一個問題是:您能否建議一個計劃來順序掃描系統並優化 SQL 查詢性能?
我建議該計劃的以下步驟:
- 檢查哪些查詢執行時間最長 -我們如何在 PostgreSQL 中執行此操作?
- 檢查哪些查詢最常執行 -我們如何在 PostgreSQL中執行此操作?
- 找出哪些查詢沒有使用索引——我們如何在 PostgreSQL 中做到這一點?
- 找出連接池是否在沒有任何延遲的情況下執行 -我們如何在 PostgreSQL 中做到這一點?
- 檢查 Hibernate 的記憶體使用情況:是否記憶體了前兩點的查詢?-我們如何在 Hibernate 中做到這一點?
- 哪些查詢傾向於訪問數據庫而不是訪問記憶體 -我們如何在 Hibernate 中做到這一點?
請提出您自己的選擇。
可能有一些軟體可以推薦這個任務嗎?
可能還有其他一些數據庫參數需要檢查、記錄、繪圖以監控?
以下是我能想到的更多檢查:
- 檢查是否啟用了 PostgreSQL 準備語句使用。
- 如果您有一個包含許多元素的表,請檢查其中一些是否可以“移動”到另一個歸檔項目表。(例如,一個返回過去 7 天交易的查詢)
- 檢查您是否不僅使用了一級記憶體,還使用了二級記憶體。也許使用 ehcache 或 infinispan。那些可以記憶體許多對象,甚至將一些對象持久化到磁碟。您必須確保其他執行緒中的修改會使這些對象無效。這也取決於您使用的事務隔離。
- 如果您有隻讀的實體(它們永遠不會被修改),您可以考慮將所有這些實體作為 java 對象載入到記憶體中。然後你可以減少一些連接。
- 對於您的實體,如果您對另一個對像有依賴關係,您可以將其 ID 保存在您的實體欄位中。然後,當您載入對象時,它不會進行連接。
- 與上一點相關,您還可以使用延遲載入實體。
- 使用 P6Spy 或類似的庫來了解查詢需要多長時間。