失效链接处理 |
SQL性能优化技巧 PDF 下载
本站整理下载:
相关截图:
![]()
主要内容:
1-1.什么是执行计划
Oracle数据库在执行sql语句时,oracle的优化器会根据一定的规则确定sql语句的执行路径,以确保sql语句能以最优性能执行.在oracle数据库系统中为了执行sql语句,oracle可能需要实现多个步骤,这些步骤中的每一步可能是从数据库中物理检索数据行,或者用某种方法准备数据行,让编写sql语句的用户使用,oracle用来执行语句的这些步骤的组合被称为执行计划。
当执行一个sql语句时oracle经过了4个步骤:
①.解析sql语句:主要在共享池中查询相同的sql语句,检查安全性和sql语法与语义。
②.创建执行计划及执行:包括创建sql语句的执行计划及对表数据的实际获取。
③.显示结果集:对字段数据执行所有必要的排序,转换和重新格式化。
④.转换字段数据:对已通过内置函数进行转换的字段进行重新格式化处理和转换.
1-2.查看执行计划
查看sql语句的执行计划,比如一些第三方工具 需要先执行utlxplan.sql脚本创建explain_plan表。
1.SQL> conn system/123456 as sysdba
2.-- 如果下面语句没有执行成功,可以找到这个文件,单独执行这个文件里的建表语句
3.SQL> @/rdbms/admin/utlxplan.sql
4.SQL> grant all on sys.plan_table to public;
在创建表后,在SQL*Plus中就可以使用set autotrace语句来显示执行计划及统计信息。常用的语句与作用如下:
set autotrace on explain:执行sql,且仅显示执行计划
set autotrace on statistics:执行sql 且仅显示执行统计信息
set autotrace on :执行sql,且显示执行计划与统计信息,无执行结果
set autotrace traceonly:仅显示执行计划与统计信息,无执行结果
set autotrace off:关闭跟踪显示计划与统计
比如要执行SQL且显示执行计划,可以使用如下的语句:
1.SQL> set autotrace on explain
2.SQL> col ename format a20;
3.SQL> select empno,ename from emp where empno=7369;
上面不一定可以执行成功,使用这个:explain plan for sql语句
1.SQL> explain plan for
2. 2 select * from cfreportdata where outitemcode='CR04_00160' and quarter='1' and month='2015';
3.Explained
4.
5.SQL> select * from table(dbms_xplan.display);
6.PLAN_TABLE_OUTPUT
7.--------------------------------------------------------------------------------
8.Plan hash value: 3825643284
9.--------------------------------------------------------------------------------
10.| Id | Operation | Name | Rows | Bytes | Cost (%C
11.--------------------------------------------------------------------------------
12.| 0 | SELECT STATEMENT | | 1 | 115 | 3
13.| 1 | TABLE ACCESS BY INDEX ROWID| CFREPORTDATA | 1 | 115 | 3
14.|* 2 | INDEX RANGE SCAN | PK_CFREPORTDATA | 1 | | 2
15.--------------------------------------------------------------------------------
16.Predicate Information (identified by operation id):
17.---------------------------------------------------
18. 2 - access("OUTITEMCODE"='CR04_00160' AND "MONTH"='2015' AND "QUARTER"='1')
19. filter("MONTH"='2015' AND "QUARTER"='1')
20.15 rows selected
PL/SQL DEVELOPER提供了一个执行计划窗口,如果在SQL Windows的窗口,按F8是执行该sql,按f5会显示该sql的执行计划。
3.理解执行计划
1.全表扫描(full table scans):这种方式会读取表中的每一条记录,顺序地读取每一个数据块直到结尾标志,对于一个大的数据表来说,使用全表扫描会降低性能,但有些时候,比如查询的结果占全表的数据量的比例比较高时,全表扫描相对于索引选择又是一种较好的办法。
2.通过ROWID值获取(table access by rowid):行的rowid指出了该行所在的数据文件,数据块及行在该块中的位置,所以通过rowid来存取数据可以快速定位到目标数据上,是oracle存取单行数据的最快方法。
3.索引扫描(index scan):先通过索引找到对象的rowid值,然后通过rowid值直接从表中找到具体的数据,能大大提高查找的效率。
4.RBO 与 CBO优化器
Oracle的优化器有两种:
RBO(Rule-Based Optimization) 基于规则的优化器
CBO(Cost-Based Optimization) 基于代价的优化器
RBO:
RBO有严格的使用规则,只要按照这套规则去写SQL语句,无论数据表中的内容怎样,也不会影响到你的执行计划;
换句话说,RBO对数据“不敏感”,它要求SQL编写人员必须要了解各项细则;
RBO一直沿用至ORACLE 9i,从ORACLE 10g开始,RBO已经彻底被抛弃。
CBO:
CBO是一种比RBO更加合理、可靠的优化器,在ORACLE 10g中完全取代RBO;
CBO通过计算各种可能的执行计划的“代价”,即COST,从中选用COST最低的执行方案作为实际运行方案;
它依赖数据库对象的统计信息,统计信息的准确与否会影响CBO做出最优的选择,也就是对数据“敏感”。
|