分享更有价值
被信任是一种快乐

Oracle如何使用物化视图查询重写query rewrite

文章页正文上

这篇文章主要介绍了Oracle如何使用物化视图查询重写query rewrite,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 1.概念
容器表:建立MATERIALIZED VIEW時自動創建、實際儲存數據的物理表,與物化視圖同名的table
基礎表: 建立物化視圖語句as select … 中引用到的table

刷新方式
refresh fast:容器表中的數據會被重用,只有基礎表被修改的數據才會同步到容器表
refreshcomplete:容器表中的數據會被全刪除,基礎表所有數據全面同步到容器表
refresh force:先嘗試refresh fast,如果失敗執行refreshcomplete
neverrefresh:永不刷新

刷新頻率
on demand: 顯示的指定刷新,可以手動刷新或者按照指定的間隔時間刷新
on commit: 在基礎表同一個transaction中刷新,即基礎表數據變化就刷新

query rewrite(查詢重寫
想提高程式效率,SQL經常執行,但不能改寫SQL(通常是多表連接),SQL語句上又不好進步一優化的,可以考慮使用query rewrite 提高性能。
如使用,關注動態參數有兩個
query_rewrite_enabled:
默認值true 啟用查詢重寫
query_rewrite_integrity:
enforced 只有物化視圖數據是最新,且約束被驗證(validate)才能使用到查詢重寫,是默認值
trusted只有物化視圖數據是最新,且約束未驗證(novalidate)但要標誌為信任(rely)才能使用到查詢重寫
stale_tolerated 即使物化視圖數據不是最新,也可以使用到查詢重寫

2.query rewrite使用案例
下列SQL要經常執行,執行效率不高,SQL語句無法優化,且table數據變化不多
select a.emp_no aemp_no,a.emp_name aemp_name,b.emp_no bemp_no,b.emp_name bemp_name
from mes1.emp a,mes1.emp1 b
where a.emp_no=b.emp_no

考慮使用物化視圖query rewrite功能,使用refresh faston commit,在基礎表數據變化時快速刷新
創建MV:
CREATE MATERIALIZED VIEW mes1.mv_emp
BUILD IMMEDIATE
REFRESH FAST ON COMMIT
ENABLE QUERY REWRITE
AS
select a.emp_no aemp_no,a.emp_name aemp_name,b.emp_no bemp_no,b.emp_name bemp_name
from mes1.emp a,mes1.emp1 b
where a.emp_no=b.emp_no;
創建報錯:ORA-23413: 表格 “MES1”.”EMP1″ 沒有具體化視觀表日誌
說明:
因為refresh fast時基表必須有物化視圖log
處理:
create MATERIALIZED VIEW LOG ON mes1.emp with rowid;
create MATERIALIZED VIEW LOG ON mes1.emp1 with rowid;
再次執行創建報錯ORA-01031: 權限不足
說明:
此處執行雖然是sys賬號,但實為mes1賬號沒有create table權免费主机域名限,具體分析可以參考http://blog.itpub.net/4227/viewspace-310155/
處理:
grant CREATE table to mes1;
再次執行創建報錯ORA-12052: 無法快速重新整理具體化視觀表 MES1.MV_EMP
說明:
原來是定義中沒有加上使用到基礎表的rowid
處理:
SELECT a.ROWID arowid,b.ROWID browid,a.emp_no aemp_no,a.emp_name aemp_name,b.emp_no bemp_no,b.emp_name bemp_name
from mes1.emp a,mes1.emp1 bwhere a.emp_no=b.emp_no
再次執行創建:
CREATE MATERIALIZED VIEW mes1.mv_emp
BUILD IMMEDIATE
REFRESH FAST ON COMMIT
ENABLE QUERY REWRITE
AS
SELECT a.ROWID arowid,b.ROWID browid,
a.emp_no aemp_no,a.emp_name aemp_name,b.emp_no bemp_no,b.emp_name bemp_name
from mes1.emp a,mes1.emp1 bwhere a.emp_no=b.emp_no ;
成功!!

最後看下query rewrite 效果
SQL> set trace traceonly;
SQL> SELECT a.emp_no aemp_no,a.emp_name aemp_name,
2 b.emp_no bemp_no,b.emp_name bemp_name
3 FROM mes1.emp a, mes1.emp1 b WHERE a.emp_no = b.emp_no;
Execution Plan
———————————————————-
Plan hash value: 2244303076
——————————————————–免费主机域名——————————-
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
—————————————————————————————
| 0 | SELECT STATEMENT | | 3 | 120 | 3 (0)| 00:00:01 |
| 1 | MAT_VIEW REWRITE ACCESS FULL| MV_EMP | 3 | 120 | 3 (0)| 00:00:01 |
—————————————————————————————感谢你能够认真阅读完这篇文章,希望小编分享的“Oracle如何使用物化视图查询重写query rewrite”这篇文章对大家有帮助,同时也希望大家多多支持云技术,关注云技术行业资讯频道,更多相关知识等着你来学习!

相关推荐: Oracle中如何是哪个ip造成的用户被锁

小编给大家分享一下Oracle中如何是哪个ip造成的用户被锁,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!在登陆时被告知test用户被锁1、用dba角色的用户登陆,进行解锁,先设置具体时间格式,以便查看具体时间 SQL> alter s…

文章页内容下
赞(0) 打赏
版权声明:本站采用知识共享、学习交流,不允许用于商业用途;文章由发布者自行承担一切责任,与本站无关。
文章页正文下
文章页评论上

云服务器、web空间可免费试用

宝塔面板主机、支持php,mysql等,SSL部署;安全高速企业专供99.999%稳定,另有高防主机、不限制内容等类型,具体可咨询QQ:360163164,Tel同微信:18905205712

主机选购导航云服务器试用

登录

找回密码

注册