常见SQL语句优化.ppt
文本预览下载声明
* Oracle SQL语句优化 */25 表结构与开发人员 要理解表与表对应的索引的结构 : 可用DBMS_METADATA包列出表结构与约束及索引的结构 用DBMS_METADATA.GET_DDL也可列出其它对象的DDL … SET HEADING OFF SET PAGESIZE 100 SET LINESIZE 160 SET TRISPOOL ON SET LONG 6000 spool c:\list_stru SELECT Select dbms_metadata.get_ddl(||chr(39)||object_type||chr(39)||, ||chr(39)||object_name||chr(39)||) from dual; FROM USER_OBJECTS ORDER BY OBJECT_TYPE,OBJECT_NAME; spool off * Oracle SQL语句优化 */25 表结构与约束 DBA_TABLES OWNER TABLE_NAME DBA_CONSTRAINTS R 为引用完整性(referential integrity) P 为主键 C 检查(check constraint on a table) U 唯一索引(unique key) V 视图可带的检查(with check option, on a view) O视图中的只读(with read only, on a view) * Oracle SQL语句优化 */25 统计任务与业务处理 大量数据的统计 : 如果经常进行大量的统计,建议选择服务器闲置时间进行; 采用作业或日程表实现; 有多个作业时要分配到不同的时间段,避免资源的争用; 参考“资源管理”… * * * * * * Oracle SQL语句优化 Oracle SQL语句优化 Oracle Database几个常见SQL优化 * Oracle SQL语句优化 */25 内容提要 FROM子句与WHERE子句顺序 几个不推荐与推荐方法 实体视图与查询重写 新SQL语句使用建议 编码人员与表结构的理解 * Oracle SQL语句优化 */25 FROM多表的顺序 ORACLE的解析器按照从右到左的顺序 FROM子句中写在最后的表(基础表 driving table)将被最先处理 ; 选择记录条数最少的表作为基础表 --表 TAB1 有16,384 数据行 --表 TAB2 有10 个数据行 ? --方法1(最佳): --选择TAB2作为基础表: select count(*) from tab1 , tab2 where . . . ? --方法2(不佳): --选择TAB2作为基础表 : select count(*) from tab2,tab1 where . . . * Oracle SQL语句优化 */25 FROM多表的顺序 FROM子句后三个表的情况: 例如:EMP表描述了LOCATION表和CATEGORY表的交集。 则EMP的顺序是关键:(这里EMP 是交叉表) 例1(效率高): SELECT * FROM LOCATION L , CATEGORY C, EMP E WHERE E.EMP_NO BETWEEN 1000 AND 2000 AND E.CAT_NO = C.CAT_NO AND E.LOCN = L.LOCN; ? 例2(效率低): SELECT * FROM EMP E , LOCATION L , CATEGORY C WHERE E.CAT_NO = C.CAT_NO AND E.LOCN = L.LOCN AND E.EMP_NO BETWEEN 1000 AND 2000; * Oracle SQL语句优化 */25 WHERE子句的连接顺序 采用自下而上的顺序解析WHERE子句 ; 表之间连接必须写在其他WHERE条件之前; 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。 例1(低效): SELECT … FROM EMP E WHERE SAL 50000 AND JOB = ‘MANAGER’ AND 25 ( SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO); 例2(高效): SELECT … FROM EMP E WHERE 25 ( SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO) AND SAL 50000 AND JOB = ‘MANAGER’; * Oracle SQL语句优化 */2
显示全部