1、,20), dbms_random.value(18,25), dbms_random.value(1,4);END LOOP;COMMIT;END;/(3)distinct重写 原始查询: select distinct sno from student where sno between 100 and 200 重写后:select sno 效果差别明显吗?是不是跟预期值有很大的不一样?为什么? 实验时我使用的是oracle11g,运行此重写没有时间上的区别,网上查了一下,是版本问题,11g和9i是有区别的。(4) group-by 重写 select avg(grade) group b
2、y age having age = 20 where age = 20 很明显,重写的后语句执行速度更快。未重写的语句有一条FILTER操作,所以更耗时。(5) 相关子查询 select sno, sname, age from student s1 where age = (select max(age) from student s2 where s1.sname= s2.sname )Create table tmp asselect sname , max(age) as maxAge group by sname;select a.sno, a.sname , a.age from
3、 student a,tmp where a.age = tmp.maxAge drop table tmp;(6) 谓词重写 select sname,age where grade!= 2 and age all (select age from student where grade= 2 ) select sname ,age where grade ! ( select min(age) 二、物化视图1. 实验要求假设有1个视图,它是2张基本表的连接,每次查询该视图,都需要对2张表进行全表扫描再连接。利用查询重写,不改动sql文本内容的情况下,执行计划采用物化视图。(1) 将创建物化
4、视图的权限授予给scottgrant create materialized view to scott;(2) 参数query_rewrite_enabled 需要是true。NAME TYPE VALUE- - -query_rewrite_enabled string TRUEquery_rewrite_integrity enforced(3) 创建2张表:create table qrw01(id number,a1 char(10),a2 char(10),a3 CHAR(10),a4 CHAR(10),a5 CHAR(10),other1 CHAR(10),other2 CHAR
5、(10),other3 CHAR(10);create table qrw02a1 CHAR(10),a2 CHAR(10),b1 CHAR(10),b2 CHAR(10),b33 CHAR(10)生成数据插入表beginfor i in 1.100000 loopinsert into qrw01 values (trunc(dbms_random.value(0,50),dbms_random.string(, 2),dbms_random.string(, 2), 2);if mod(i,1000)=0 thencommit;end if;end loop;end;declarevars
6、ql varchar2(200);CURSOR mycur isselect id,a1,a2,a3,a4,a5from qrw01;for i in 1.5 loopfor varsql in mycur loopinsert into qrw02 values(varsql.id,varsql.a1,varsql.a2,varsql.a3,varsql.a4,varsql.a5,2张表的数据量:SQL SELECT COUNT(*) FROM QRW02; COUNT(*)- 500000 SELECT COUNT(*) FROM QRW01; 100000(4) 创建一个普通视图:cre
7、ate view v_qrw01 asselect q1.id,q1.other1,q1.other2,q1.other3,q2.b1,q2.b2,q2.b33From qrw01 q1,qrw02 q2where q1.id=q2.idand q1.a1=q2.a1and q1.a2=q2.a2and q1.a3=q2.a3and q1.a4=q2.a4and q1.a5=q2.a5;该视图查出来的数据量有50w。 select count(*) from v_qrw01;(5) 下面一条SQL语句的开销,2张表的全表扫描: select id,other1,other2,other3,b1
8、,b2,b33 from scott.v_qrw01 where id=14;查看执行计划(6) 在2张表上创建物化视图:create materialized view log on qrw01 with rowid;create materialized view log on qrw02 with rowid;创建物化视图,查询语句和前面视图的语句相同。create materialized view qrw_mv01refresh fastwith rowidon commitenable query rewriteasselect q1.rowid q1rowid,q2.rowid q2rowid,q1.id,from qrw01 q1,qrw02 q2对表进行分析: exec DBMS_STATS.GATHER_TABLE_STATS(liaody,qrw01PL/SQL 过程已成功完成。qrw02qrw_mv01(7) 相同的sql,执行计划变为扫描物化视图。 select id,other1,other2,other3,b1,b2,b33 from liaody.v_qrw01 where id=14;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1