8. 数据类型选择与表结构设计统计每种产品的销售情况
select a.product_sn, a.title, sum(b.buynum) as b_count, sum(a.price*b.buynum) p_count from order_detail b, products a where a.product_sn=b.product_sn group by a.product_sn
28. 视图对产品的订购情况统计就简化了
select a.product_sn, a.title, sum(b.buynum) as b_count, sum(a.price*b.buynum) as p_count from products a, order_detail b where a.id=b.product_id group by a.id;
select product_sn, title, sum(buynum) as b_count, sum(price*buynum) as p_count from v_prod_order group by id
47. 表的扫描与驱动表例子
(1)select ename, sal from emp;
(2)select ename, sal from emp where sal>1000;
问题:哪个语句执行速度快?
分析(在sal字段上有索引的情况下)
语句(1):全表扫描
语句(2):部分扫描
原则:尽量避免大表全表扫描,特别是在多表连接查询情况下
49. WHERE子句连接顺序例子
(1)select a.ename, a.sal, b.dname from emp a, dept b where a.sal>1000 and a.deptno=b.deptno;
(2)select a.ename, a.sal, b.dname from emp a, dept b where a.deptno=b.deptno and a.sal>1000;
问题:哪个语句执行速度快?
57. 优化模式RULE模式:即古老的基于规则的优化方式
CHOOSE模式
SQL语句既可以使用RBO优化器也可以使用CBO优化器,判断该SQL到底使用哪个优化器的依据是所访问的对象是否存在统计信息
8i及9i中为默认值,10g已经废除
First Rows模式
与Choose方式是类似的,所不同的是当一个表有统计信息时,它将是以最快的方式返回查询的最先的几行,从总体上减少了响应时间。
All Rows模式
也就是我们所说的Cost的方式,当一个表有统计信息时,它将以最快的方式返回表的所有的行,从总体上提高查询的吞吐量
如果没有统计信息则走基于规则的方式。
10g中为默认值
58. 优化模式优化模式的设置
Instance级别:在init.ora文件中设定OPTIMIZER_MODE=RULE|CHOOSE|FIRST_ROWS|ALL_ROWS
Sessions级别:通过SQL> ALTER SESSION SET OPTIMIZER_MODE=RULE|CHOOSE|FIRST_ROWS|ALL_ROWS;来设定
语句级别:使用HINTS,/*+ALL_ROWS*/、/*+FIRST_ROWS*/、/*+CHOOSE*/、/*+RULE*/ ,例如:
SQL> SELECT /*+ RULE */ a.userid, b.name, b.depart_name 2 FROM tf_f_yhda a, tf_f_depart b 3 WHERE a.userid=b.userid;
59. 优化模式使用CBO的方式,应及时更新表和索引的统计信息,否则将生成不切合实的执行计划
SQL> ANALYZE TABLE table_name COMPUTE STATISTICS;
SQL> ANALYZE INDEX index_name ESTIMATE STATISTICS;
查看表或索引是否有统计信息
SQL>SELECT * FROM user_tables WHERE table_name=*** AND num_rows is not null;
SQL>SELECT * FROM user_indexes WHERE table_name=*** AND num_rows is not null;
60. SQL语句优化SQL语句优化规则
Oracle优化器
Oracle的连接查询
索引的使用
61. Oracle连接查询实现方法连接查询
select … from a, b where …
select … from a [left|right] join b on …
连接查询的执行复杂度远远比单表查询高
Oracle如何实现连接查询?——直接关系到连接查询的效率!
74. 索引的使用比较两个查询
语句A:SELECT dname,deptno FROM dept WHERE deptno NOT IN(SELECT deptno FROM emp);
语句B:SELECT dname,deptno FROM dept WHERE NOT EXISTS(SELECT deptno FROM emp WHERE dept.deptno = emp.deptno);
79. 归档日志管理手动归档
切换联机日志(自动产生归档事件,LGWR写入)
SQL>alter system switch logfile;
对所有没有归档的重做日志进行归档:
SQL>ALTER SYSTEM ARCHIVE LOG ALL;
当前的重做日志文件进行归档:
SQL>ALTER SYSTEM ARCHIVE CURRENT
指定日志序列号的重做日志文件进行归档
SQL>ALTER SYSTEM ARCHIVE LOG SEQUCNE 56;
80. 归档日志管理指定日志组编号的重做日志文件进行归档
SQL>ALTER SYSTEM ARCHIVE LOG GROUP 2
指定联机的重做日志文件进行归档
SQL>ALTER SYSTEM ARCHIVE LOG
LOGFILE 'D:\oracle\oradata\work\REDO01.LOG '
将下一个没有归档的重做日志文件组进行归档:
SQL>ALTER SYSTEM ARCHIVE LOG NEXT
启动/禁止自动归档
SQL>alter system archive log start/stop