Oracle
使用索引從現有視圖創建物化視圖而不刷新
我已經有了一個工作數據庫視圖:
CREATE OR REPLACE FORCE VIEW "USER_DATA_VIEW" ("APP_USER_ID", "FIRST_NAME", "LAST_NAME", "FULL_NAME", "LOCATION_ID", "LOCATION_NAME") AS SELECT U.APP_USER_ID, U.FIRST_NAME, U.LAST_NAME, U.FIRST_NAME || ' ' || U.LAST_NAME FULL_NAME, U.LOCATION_ID, LOC.LOCATION_NAME FROM APP_USER U JOIN LOCATION LOC ON U.LOCATION_ID = LOC.LOCATION_ID ;
由於使用者/位置數據不經常更改,並且嚴重依賴於其他視圖和應用程序的一部分,我想嘗試記憶體以查看是否可以從中獲得更多性能。
我不是一個預言家,我正在閱讀物化視圖可能會這樣做。
如何使用
app_user_id
列上的索引且沒有刷新選項的現有視圖創建物化視圖?我試過這個:
CREATE MATERIALIZED VIEW USER_DATA_VIEW_MT BUILD IMMEDIATE NO REFRESH AS SELECT U.APP_USER_ID, U.FIRST_NAME, U.LAST_NAME, U.FIRST_NAME || ' ' || U.LAST_NAME FULL_NAME, U.LOCATION_ID, LOC.LOCATION_NAME FROM APP_USER U JOIN LOCATION LOC ON U.LOCATION_ID = LOC.LOCATION_ID
還有其他幾個版本,但無法創建它。
NO REFRESH
不是有效的語法,它是NEVER REFRESH
. 但我猜你想偶爾刷新 mview,所以這REFRESH ON DEMAND
是一個更好的選擇。僅此還不夠,您還需要將參數設置
query_rewrite_enabled
為stale_tolerated
:alter session set query_rewrite_integrity=stale_tolerated;
您還提到使用索引,是的,您可以在物化視圖上創建索引。
您的查詢非常簡單,只有 2 個帶有連接的表,我認為您不需要為此進行物化視圖 + 查詢重寫。您可以簡單地正確索引基表。
預設情況下,查詢重寫適用於最新的物化視圖,因此它可以提供最新的實際數據(正確的結果)。您需要明確允許會話中的數據庫使用
stale_tolerated
. 無論此參數如何,您的 mview 都將保持陳舊狀態,直到您明確刷新它。這是查詢重寫處理陳舊數據所必需的。