oracle性能优化系列学习二
4。选择最有效的表名称顺序(仅在基于规则的优化器中有效)
Oracle解析器按照从左到右的顺序,在from子句中的from子句中包含一个表,因此在表的结尾(基于表驱动表)将首先处理。在from子句包含多个表时,必须在表作为基础时选择表中的记录数。连接它们的表Oracle将使用排序和合并方法。首先,扫描第一个表(在最后一个语句的from子句中)和记录发送顺序,然后扫描第二个表(最后一个二米中的from子句),第二个从记录中的检索表,以及相应记录中的第一个表合并。
例如:
表16384记录表
表1对记录
选择TAB2作为基表(最好的方法)
select count(*)从表,对执行时间0.96秒
选择TAB2作为基表(差法)
select count(*)从表2,表执行时间26.09秒
如果有超过3个表连接查询,我们需要选择交叉表(交集表)作为基表,而交叉表是指其他表引用的表。
例如:
EMP表描述位置表和类别表的交集。
*选择
从位置L,
C类,
EMP E
在1000和2000之间的e.emp_no
和e.cat_no = c.cat_no
AND E.LOCN = L.LOCN
它比下面的SQL更有效
*选择
来自EMP E,
位置L,
C类
在e.cat_no = c.cat_no
和e.locn = l.locn
1000和2000之间e.emp_no
5中的连接顺序。WHERE子句。
Oracle使用自底向上序列解析WHERE子句。根据这个原则,表之间的连接必须写在其他条件之前。可以筛选出最多记录数的条件必须写在WHERE子句的结尾处。
例如:(低效,执行时间156.3秒)
选择…
从EMP E
萨尔50000
工作=经理
和25 <(从EMP中选择计数(*)
在MGR = e.empno);
(效率高,执行时间10.6秒)
选择…
从EMP E
其中25 <从EMP中选择计数(*)
在MGR = e.empno)
萨尔50000
工作=经理;
避免在6中使用*。SELECT子句。
当您想列出SELECT子句中的所有列时,使用动态SQL列引用*是一种方便的方法。不幸的是,这是一种非常低效的方式。事实上,Oracle在解析过程中,将*转换为所有的名称,这是通过查询数据字典来完成的,这意味着会有更多的时间消耗。
7。减少访问数据库的次数
在执行每个SQL语句时,Oracle在内部执行许多任务:解析SQL语句、估算索引利用率、绑定变量、读取数据块等。可以看出,减少访问数据库的数量实际上可以减少Oracle的工作量。
例如,有三种方法可以检索雇员人数等于0342或0291的雇员。
方法1(效率最高)
选择emp_name,工资等级
从EMP
在emp_no = 342;
选择emp_name,工资等级
从EMP
在emp_no = 291;
方法2(次低效率)
声明
光标C1(e_no号)
选择emp_name,工资等级
从EMP
在emp_no = e_no;
开始
打开C1(342);
把C1输入……,;
的…
打开C1(291);
把C1输入……,;
关闭C1;
结束;
方法3(高效率)
选择a.emp_name,A.SALARY,a.grade,
b.emp_name,B.SALARY,b.grade
来自EMP A,EMP B
在a.emp_no = 342
和b.emp_no = 291;
注意{ 1 } { 2 }下一页正在查看Oracle教程:Oracle SQL性能优化系列学习二:意大利:
在SQL*Plus复位arraysize参数、SQL Forms和PRO*C能提高检索的数据为每个数据库的访问量,并建议值是200。
{ 1 } { 2 }的最后一页