我有一個從我們的OLTP Oracle數據庫掌握的數據集市,使用具有按需快速刷新功能的基本物化視圖。刷新工作正常。我有興趣添加的是關於每個物化視圖刷新的一些統計信息,例如自上次刷新以來應用於主表的插入,更新和刪除的數量,如我在user_tab_modifications
中可以找到的數據。物化視圖可能嗎?物化視圖:如何查找刷新期間應用的更新,插入和刪除的數量?
6
A
回答
6
在刷新之前,您可以查詢物化視圖日誌以查看它存儲的變化向量。這些將是刷新過程中需要應用到物化視圖的變化向量(假設只有一個物化視圖依賴於此物化視圖日誌)。
例如,如果我創建我的表,物化視圖日誌和物化視圖。
SQL> create table foo(col1 number primary key);
Table created.
SQL> create materialized view log on foo;
Materialized view log created.
SQL> ed
Wrote file afiedt.buf
1 create materialized view mv_foo
2 refresh fast on demand
3 as
4 select *
5* from foo
SQL>/
Materialized view created.
SQL> insert into foo values(1);
1 row created.
SQL> insert into foo values(2);
1 row created.
SQL> commit;
Commit complete.
現在,我刷新物化視圖,並確認表和物化視圖是同步的
SQL> exec dbms_mview.refresh('MV_FOO');
PL/SQL procedure successfully completed.
SQL> select * from user_tab_modifications where table_name = 'MV_FOO';
no rows selected
SQL> select * from foo;
COL1
----------
1
2
SQL> select * from mv_foo;
COL1
----------
1
2
由於這兩個對象是同步的,物化視圖日誌是空(物化查看日誌將被命名爲MLOG$_<<table name>>
SQL> select * from mlog$_foo;
no rows selected
現在,如果我插入一個新行到表中,我可以看到在物化視圖日誌行與的指示INSERT
SQL> insert into foo values(3);
1 row created.
SQL> select * from mlog$_foo;
COL1 SNAPTIME$ D O
---------- --------- - -
CHANGE_VECTOR$$
--------------------------------------------------------------------------------
XID$$
----------
3 01-JAN-00 I N
FE
2.2519E+15
所以你可以做這樣的事情來獲得掛起的插入,更新的數量,並刪除。
SELECT SUM(CASE WHEN dmltype$$ = 'I' THEN 1 ELSE 0 END) num_pending_inserts,
SUM(CASE WHEN dmltype$$ = 'U' THEN 1 ELSE 0 END) num_pending_updates,
SUM(CASE WHEN dmltype$$ = 'D' THEN 1 ELSE 0 END) num_pending_deletes
FROM mlog$_foo
但是,刷新物化視圖日誌後,此信息就消失了。
另一方面,USER_TAB_MODIFICATIONS
應跟蹤自上次收集統計信息以來對物化視圖所做的更改的近似數量,就像跟蹤表的信息一樣。如果要在刷新實體化視圖之前和之後捕獲數據,幾乎可以肯定需要調用DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO
以強制數據顯示。
SELECT inserts, updates, deletes
INTO l_starting_inserts,
l_starting_updates,
l_starting_deletes
FROM user_tab_modifications
WHERE table_name = 'MV_FOO';
dbms_mview.refresh('MV_FOO');
dbms_stats.flush_database_monitoring_info;
SELECT inserts, updates, deletes
INTO l_ending_inserts,
l_ending_updates,
l_ending_deletes
FROM user_tab_modifications
WHERE table_name = 'MV_FOO';
l_incremental_inserts := l_ending_inserts - l_starting_inserts;
l_incremental_updates := l_ending_updates - l_starting_updates;
l_incremental_deletes := l_ending_deletes - l_starting_deletes;
相關問題
- 1. 刷新按鈕 - 插入,刪除,更新後刷新數據網格視圖
- 2. 如何防止物化視圖在pg_restore期間刷新?
- 3. oracle物化視圖刷新時間
- 4. 刷新物化視圖
- 5. 物化視圖不刷新
- 6. pgsql物化視圖刷新
- 7. Dokku + Postgres:如何刷新物化視圖?
- 8. Postgres如何刷新物化視圖?
- 9. 如何刷新在Oracle物化視圖
- 10. 如何刷新我的ListView以處理數據?像 - 插入,更新和刪除
- 11. 爲什麼刷新物化視圖併發阻塞插入/更新?
- 12. 如何在插入更新或刪除之後刷新JTable
- 13. Oracle禁用物化視圖刷新
- 14. 使用樹視圖插入,更新和刪除
- 15. 水壺PDI:更好的查找和插入更新或插入更新+查找
- 16. 簡單的數據庫視圖(更新,插入,刪除)
- 17. Oracle - 更新物化視圖
- 18. 要插入,更新和刪除的SSIS
- 19. 檢查物化視圖的最後更新時間
- 20. 刷新現有物化視圖
- 21. 物化視圖刷新從Informatica
- 22. 獲取Oracle物化視圖以刷新
- 23. 歷史刷新物化視圖
- 24. 物化視圖刷新致力
- 25. 物化視圖停止刷新
- 26. PostgreSQL物化視圖刷新「堆棧」
- 27. 物化視圖 - 識別上次刷新
- 28. JTable如何在插入刪除或更新數據後刷新表模型。
- 29. 基於非快速刷新視圖的快速刷新物化視圖
- 30. 如何更新/插入/刪除CrossCompany
謝謝你這個非常深入的答案! – user1284595 2012-03-22 14:59:06