我有一個查詢需要很長時間,我想優化它。我正在尋找最有效的方式來做到這一點。優化查詢 - 使用字段或使用其他表格
我正在使用PostgreSQL數據庫的Hibernate/JPA,但任何解決方案應該是一個通用的JPA之一。
術語
- 用戶:在系統中的用戶。
- 朋友:用戶的一個朋友。用戶將有N個朋友。
- 會議:使用系統的會話。可以打開或關閉。
- 上下文:會話的上下文。用戶可能在任何給定時間內每個上下文有一個打開的會話,並且每個上下文可能有許多過去的關閉會話。
查詢
我需要執行一個查詢,給定一個用戶名,使我有以下幾點:
- 獲取該用戶的所有朋友
- 對於每個朋友:
- 如果朋友有任何打開的會話,請獲取所有打開的會話(針對所有上下文)
- 否則,請將朋友的最新會話排除在所有上下文之外。
注意,友誼都是存儲在不同的數據庫,所以我不能將此主題融入在任何情況下,一個大的查詢。
例
用戶A具有三個朋友:B,C,d。有兩個上下文,1和2。朋友具有以下數據:
(下面的格式是會話ID - 用戶,語境)
- 1 - B,1:打開會話
- 2 - B,2:開始關閉會話年02月 - 27
- 3 - B,2:上開始閉會話FEB-26
- 4 - C,1:02月27
- 5開始關閉會話 - C,1:關閉會話2月26日開始
- 6 - C,2:02月 - 26
- 7開始關閉會話 - C,2:關閉會話年02月 - 25
- 8開始 - d,1:打開會話
- 9 - d, 2:打開會話
查詢應得到我: B:第一節(所有打開的會話) C:第4節(最新的非公開會議) d:8,9會話(所有打開的會話)
當前狀態
我查詢的工作分三個步驟:
- 獲取用戶
- 的各界朋友對每個朋友:
- 獲取所有打開的會話的朋友
- 如果有任何公開會議,返回所有公開會話
- 獲取最新的會話爲朋友,返回該會話
顯然這是很多的疑問。 對於初學者,我將採取上述步驟2並將其轉換爲單個查詢。我的擔心與第二個查詢有關。問題是 - 如何使其更加優化。因此,該問題可以改述:
「給定一組N個朋友ID,獲取所有這些朋友的所有開放會話或最新會話。」
建議的解決方案
有我們想出了兩種基本的解決方案,我們正在考慮這將是更好的。
表解決方案表示將保留一個將在用戶,上下文和最新會話之間關聯的新表。該解決方案的含義是:
- 創建一個新的實體&表「最新會議」
- 表將具有這些列:
- 用戶
- 語境
- 最新會話ID
- 該表將由會話實體在post persist上進行更新,以便任何新的p ersisted會話將自動更新此表。
- 新查詢將從此表中獲取用戶所有朋友的所有記錄,並對其進行處理以創建最終結果。
列解決方案表示在會話表上保留「最新」標誌列。該解決方案的含義是:
- 創建最新的(一個布爾值)一個新的領域
- 列將通過郵寄方式設置持久會話實體,使昔日的「最新」會議將不再是最新的,新的會議將成爲最新的會議。
- 新查詢將從原始會話表中獲取用戶所有朋友的所有最新記錄(通過將新列納入語句的條件中)並對其進行處理以創建最終結果。
這些都有優點和缺點,我們似乎還沒有贏家。顯然,可能還有其他更好的解決方案我們沒有考慮過。我希望看到的是以上哪個更好,爲什麼,或者是你自己的更好的方法。
爲什麼不同的數據庫友誼?它是真的不同的數據庫或不同的架構? – Unreason 2011-02-28 10:42:43
如何使用功能視圖? 緩存可能是一個很大的幫助,如果可能的話。 – 2011-02-28 10:16:18
據我瞭解,一個視圖會以這種或那種方式運行復雜的查詢,並且我試圖通過在數據庫更新期間引發更多管理來避免這種情況,從而提高查詢的性能。 – 2011-02-28 10:28:28