Oracle

使用索引從現有視圖創建物化視圖而不刷新

  • November 2, 2016

我已經有了一個工作數據庫視圖:

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_enabledstale_tolerated

alter session set query_rewrite_integrity=stale_tolerated;

您還提到使用索引,是的,您可以在物化視圖上創建索引。

您的查詢非常簡單,只有 2 個帶有連接的表,我認為您不需要為此進行物化視圖 + 查詢重寫。您可以簡單地正確索引基表。

預設情況下,查詢重寫適用於最新的物化視圖,因此它可以提供最新的實際數據(正確的結果)。您需要明確允許會話中的數據庫使用stale_tolerated. 無論此參數如何,您的 mview 都將保持陳舊狀態,直到您明確刷新它。這是查詢重寫處理陳舊數據所必需的。

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