物化檢視學習筆記
物化檢視學習筆記
物化檢視和檢視從字面上來看就差兩個字,可是差兩個字就複雜很多了,
所以打算整理下自己物化檢視方面的知識,讓自己加深對物化檢視的理解。
什麼是物化檢視及物化檢視的特性
物化檢視(materialized view)是一個schema 物件。可以用於彙總,計算,
複製,分發資料。物化檢視中儲存了SQL 語句的查詢結果。
1、物化檢視與檢視一個很重要的不同在於物化檢視是實際的儲存SQL語句的結果,
需要消耗相應的儲存空間,所以建立物化檢視的使用者需要有足夠的表空間配額。
2、物化檢視可以根據一定的策略在master table 改變以後refresh。
3、如果一個SQL 查詢可以重寫到一個物化檢視,物化檢視可以提高查詢語句的效能。
4、物化檢視對運用程式和使用者是透明的。
物化檢視使用的場景
1、在資料倉儲環境下,可以使用物化檢視儲存來自於聚集函式的計算結果。比如sum,
avg.這樣透過對物化檢視的查詢,可以提高響應時間,因為物化檢視中的資料是預先
計算好的,或者是查詢物化下來的join 結果集。
2、物化檢視可以用在複製,所以物化檢視時常被稱作快照(snapshot)。
oracle 8i開始snapshot 被重新定義為物化檢視,在語法方面也做了改動。
透過database link 可以把遠端的master database 中的master tables 中的資料
的一部分或者全部複製到本地,這很適合於客戶端不經常連線到網路中的情形
,方便本地訪問資料,並且本地所在的更新也可以同步到master database。
3、在移動計算環境下,可以透過物化檢視,定期的從中央伺服器下載資料
到移動客戶端,並上傳客戶端所在的更新。
我覺得後面兩種情形都是複製特性的運用。
建立物化檢視前的準備工作
1、在自己的schema 下建立物化檢視。你需要獲得create materialized view、
create table 系統許可權。所有master table 的select 許可權。
2、在其他使用者的schema 下建立物化檢視。你需要create any materialized view
系統許可權。物化檢視的所有者需要具備create table 系統許可權和所有master table
的select 許可權。
注:
1、建立物化檢視所需要的許可權不能透過role 授權給user,而是要直接的授權給user.
2、為了能夠建立refresh-on-commit 的物化檢視,使用者必須獲得所有master table 的
on commit refresh 物件許可權。
3、物化檢視的所有者應該具備在相應表空間上足夠的空間配額,以便儲存物化檢視。
4、建立可以被query rewrite 的物化檢視,還需要額外的許可權,請參考:
*******************************************************************
關於建立物化檢視許可權的示例。
SQL> conn hr/hr
Connected.
Connected.
SQL> create materialized view emp_mv
2 refresh fast next sysdate
3 as select employee_id,last_name,first_name
4 from employees;
from employees
*
ERROR at line 4:
ORA-01031: insufficient privileges
2 refresh fast next sysdate
3 as select employee_id,last_name,first_name
4 from employees;
from employees
*
ERROR at line 4:
ORA-01031: insufficient privileges
SQL> show user
USER is "SYS"
USER is "SYS"
SQL> grant create materialized view to hr;
Grant succeeded.
Grant succeeded.
SQL> conn hr/hr
Connected.
SQL> create materialized view emp_mv
2 refresh fast next sysdate
3 as select employee_id,last_name,first_name
4 from employees;
Materialized view created.
Connected.
SQL> create materialized view emp_mv
2 refresh fast next sysdate
3 as select employee_id,last_name,first_name
4 from employees;
Materialized view created.
*****************************************************************
物化檢視refresh 的方式
當master table 更新以後,可以透過以下兩種方式來refresh 物化檢視。
1、complete refresh
這種方式的refresh 需要在定義物化檢視的時候透過build immediate 指定。
這種方式的refresh 實際上是重新執行一遍該物化檢視的定義的查詢。
當master table 很大的時候,因為需要訪問很多的大量的實際,所有速度
將會變的很慢。
2、fast refresh
這種方式的refresh 不需要從頭開始構建物化檢視,而是透過增量的方式,
僅僅運用refresh 改變的那一部分,所有效率非常的高。為了支援fast refresh
需要建立materialized view logs 用來跟蹤改變(insert,update,delete)。這個
很想redis 裡面的aof 檔案。materialized view logs 和master table 是在
同一個schema 中的。
***************************************************************
關於refresh的示例。
關於refresh的示例。
SQL> create materialized view log on employees;--先要建立物化檢視log。
Materialized view log created.
Materialized view log created.
SQL> create materialized view emp_mv--建立一個物化檢視指定refresh 的方式和時間。
2 refresh fast next sysdate
3 as select employee_id,last_name,first_name
4 from employees;
Materialized view created.
2 refresh fast next sysdate
3 as select employee_id,last_name,first_name
4 from employees;
Materialized view created.
SQL> select * from emp_mv
2 where employee_id = 100;
EMPLOYEE_ID LAST_NAME FIRST_NAME
----------- ---------- ----------
100 King Steven
2 where employee_id = 100;
EMPLOYEE_ID LAST_NAME FIRST_NAME
----------- ---------- ----------
100 King Steven
SQL> update employees--對master table 做一個更新。
2 set last_name = upper(last_name)
3 where employee_id = 100;
1 row updated.
2 set last_name = upper(last_name)
3 where employee_id = 100;
1 row updated.
SQL> select * from emp_mv--未提交的時候物化檢視和master table 不同步。
2 where employee_id = 100;
EMPLOYEE_ID LAST_NAME FIRST_NAME
----------- ---------- ----------
100 King Steven
2 where employee_id = 100;
EMPLOYEE_ID LAST_NAME FIRST_NAME
----------- ---------- ----------
100 King Steven
SQL> commit;
Commit complete.
SQL> select * from emp_mv--物化檢視和master table 同步。
2 where employee_id = 100;
EMPLOYEE_ID LAST_NAME FIRST_NAME
----------- ---------- ----------
100 KING Steven
Commit complete.
SQL> select * from emp_mv--物化檢視和master table 同步。
2 where employee_id = 100;
EMPLOYEE_ID LAST_NAME FIRST_NAME
----------- ---------- ----------
100 KING Steven
上面建立的物化檢視指定的refresh 方式是fast refresh,時間是實時的同步。
下面建立一個refresh fast on commit 方式的物化檢視.
我們已經在master table 上建立過materialized view log所以不需要再建立。
SQL> create materialized view emp_mv1
2 refresh fast on commit
3 as select employee_id,last_name,first_name
4 from employees;
2 refresh fast on commit
3 as select employee_id,last_name,first_name
4 from employees;
Materialized view created.
SQL> select * from emp_mv1
2 where employee_id = 100;
EMPLOYEE_ID LAST_NAME FIRST_NAME
----------- -------------- --------------
100 King Steven
SQL> select * from emp_mv1
2 where employee_id = 100;
EMPLOYEE_ID LAST_NAME FIRST_NAME
----------- -------------- --------------
100 King Steven
在master table 中執行一個更新。
SQL> update employees
2 set last_name = upper(last_name)
3 where employee_id = 100;
1 row updated.
SQL> update employees
2 set last_name = upper(last_name)
3 where employee_id = 100;
1 row updated.
沒有提交前檢視下emp_mv1 。
SQL> select * from emp_mv1
2 where employee_id = 100;
EMPLOYEE_ID LAST_NAME FIRST_NAME
----------- -------------- --------------
100 King Steven
SQL> select * from emp_mv1
2 where employee_id = 100;
EMPLOYEE_ID LAST_NAME FIRST_NAME
----------- -------------- --------------
100 King Steven
提交以後會馬上以fast refresh 方式重新整理物化檢視。
SQL> commit;
Commit complete.
SQL> select * from emp_mv1
2 where employee_id = 100;
EMPLOYEE_ID LAST_NAME FIRST_NAME
----------- -------------- --------------
100 KING Steven
SQL> commit;
Commit complete.
SQL> select * from emp_mv1
2 where employee_id = 100;
EMPLOYEE_ID LAST_NAME FIRST_NAME
----------- -------------- --------------
100 KING Steven
*****************************************************************
關於物化檢視自動query rewrite 的示例。
這裡說的是自動查詢重寫,而不是在from 子句中指定查詢的物化檢視。query rewrite是最佳化器的一項功能,最佳化器將會在語義一致的前提下使用帶有物化檢視的執行計劃。
SQL> set autotrace trace explain
SQL> select employee_id,last_name,first_name
2 from employees;
Execution Plan
----------------------------------------------------------
Plan hash value: 1445457117
-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 108 | 2052 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| EMPLOYEES | 108 | 2052 | 3 (0)| 00:00:01 |
-------------------------------------------------------------------------------
SQL> select employee_id,last_name,first_name
2 from employees;
Execution Plan
----------------------------------------------------------
Plan hash value: 1445457117
-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 108 | 2052 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| EMPLOYEES | 108 | 2052 | 3 (0)| 00:00:01 |
-------------------------------------------------------------------------------
不重寫,why?因為我們建立emp_mv1 的時候沒有指定enable query rewrite.可以透過下面的語句實現enable query rewrite 。
SQL> alter materialized view emp_mv1 enable query rewrite;
Materialized view altered.
Materialized view altered.
SQL> exec dbms_stats.gather_table_stats(user,'EMP_MV1');
PL/SQL procedure successfully completed.
SQL> SET LINES 120
SQL> select employee_id,last_name,first_name
2 from employees;
Execution Plan
----------------------------------------------------------
Plan hash value: 2814234707
----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 108 | 1944 | 3 (0)| 00:00:01 |
| 1 | MAT_VIEW REWRITE ACCESS FULL| EMP_MV1 | 108 | 1944 | 3 (0)| 00:00:01 |
----------------------------------------------------------------------------------------
PL/SQL procedure successfully completed.
SQL> SET LINES 120
SQL> select employee_id,last_name,first_name
2 from employees;
Execution Plan
----------------------------------------------------------
Plan hash value: 2814234707
----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 108 | 1944 | 3 (0)| 00:00:01 |
| 1 | MAT_VIEW REWRITE ACCESS FULL| EMP_MV1 | 108 | 1944 | 3 (0)| 00:00:01 |
----------------------------------------------------------------------------------------
當我們開啟enable query write 的時候,我們發現對employees 的查詢自動的重寫為對物化視emp_mv1 的查詢。
********************************************************************************
刪除物化檢視及物化檢視logs
SQL> drop materialized view emp_mv1;
Materialized view dropped.
Materialized view dropped.
SQL> drop materialized view log on employees;
Materialized view log dropped.
Materialized view log dropped.
注:一個master table 上面只能建立一個materialized view log 物件。
小結:
整理了這些物化檢視的知識,雖然腦袋知識條理清楚了很多。但是還有很多關於物化檢視方面的知識需要學習,加油!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26110315/viewspace-732511/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ClickHouse 物化檢視學習總結
- 物化檢視
- 物化檢視(zt)
- iOS學習筆記04 檢視切換iOS筆記
- 檢視提交歷史 —— Git 學習筆記 11Git筆記
- Echarts檢視視覺化-學習筆記(努力更新中)Echarts視覺化筆記
- calcite物化檢視詳解
- Solidity語言學習筆記————27、檢視函式Solid筆記函式
- Adaptive AUTOSAR 學習筆記 5 - 架構 - 物理檢視APT筆記架構
- Oracle普通檢視和物化檢視的區別Oracle
- Adaptive AUTOSAR 學習筆記 4 - 架構 - 邏輯檢視APT筆記架構
- 資料庫的物化檢視資料庫
- 物化檢視分割槽實驗
- “平板電視”學習筆記筆記
- 物化檢視幾個知識點
- Oracle物化檢視的建立及使用(二)Oracle
- Oracle物化檢視的建立及使用(一)Oracle
- ClickHouse 效能優化?試試物化檢視優化
- ClickHouse效能優化?試試物化檢視優化
- MySQL筆記 13 檢視MySql筆記
- OpenCV學習筆記-Harris角點檢測OpenCV筆記
- 基於ROWID更新的物化檢視測試
- StarRocks 物化檢視重新整理流程及原理
- StarRocks 物化檢視重新整理流程和原理
- 物化檢視如何快速完成資料聚合操作?
- ASP.Net MVC開發基礎學習筆記(10):分部檢視PartialViewASP.NETMVC筆記View
- oracle學習筆記(十四) 資料庫物件 索引 檢視 序列 同義詞Oracle筆記資料庫物件索引
- 【筆記】黃如花.資訊檢索.學習心得筆記
- AI學習筆記(十二)物體檢測(上)AI筆記
- numpy的學習筆記\pandas學習筆記筆記
- Vue學習筆記(六):監視屬性Vue筆記
- JVM狂神說視訊學習筆記JVM筆記
- Postgres使用trigger自動重新整理物化檢視
- 物化檢視快速重新整理與ORA-00001
- 使用Materialise物化檢視解耦微服務架構解耦微服務架構
- 學習筆記(11)商品上架與ES檢索筆記
- MySQL之檢視學習MySql
- 學習筆記筆記
- PySimpleGUI 學習筆記(純新手記錄,大神請忽視)GUI筆記