我有兩個表A和B,其中A中的記錄被映射到B中的多個記錄。有查詢顯示錶A的記錄以及所有映射的記錄在一個單一的線表B中,如:Oracle 1:n高效查詢
TABLE A
--------
ID Name Tag ......
1 X 213
2 Y 222
TABLE B
--------
ID ACCESS_AREA
1 101
1 104
1 105
2 101
2 103
該查詢是這樣的:
SELECT ID,
Name,
Tag ,.....,
(SELECT WM_CONCAT(ACCESS_AREA)
FROM B
WHERE ID = A.ID) Access_areas
FROM A
雖然上述工程中,查詢的性能是非常低的,因爲在這兩個記錄數桌子非常大。任何對access_areas
進行過濾或排序都會導致性能進一步下降。
我們考慮過使用物化視圖來事先計算這些值,以便它成爲一個簡單的聯接,但mv不允許使用聚合函數快速刷新此類查詢的提交。
另一種方法是向表A添加一列,該列包含B的計算值,並在表B中使用觸發器更新新列(如果發生任何更改)。但是這也不可行,因爲您無法查詢觸發器所在的同一個表。
作爲最後的手段,我們決定實現第二個選項並通過應用程序代碼更新列,這非常乏味。
任何想法?
對不起,無論我提到的是一個類似於我面臨的場景的例子。實際上我們有兩個更類似的計算列。另外,不幸的是,我在設計規範中沒有發言權。 – Rnet
有一個前端界面,它列出了單個頁面中第一個表格及其相關表格的所有記錄,因此查詢 – Rnet
「頁面」是指HTML嗎?然後不用擔心 - 與通過HTTP傳遞此性能問題相比,查詢性能問題**沒有任何**,並嘗試使用HTML進行呈現。現在開始磨合你的簡歷 – symcbean