Oracle语句优化分析说明第1页2
例如:
表16384记录表
表1对记录
选择TAB2作为基表(最好的方法)
select count(*)从表,对执行时间0.96秒
选择TAB2作为基表(差法)
select count(*)从表2,表执行时间26.09秒
2、Oracle使用自底向上序列解析WHERE子句。根据这个原则,表之间的连接必须写在其他条件之前。可以筛选出最多记录数的条件必须写在WHERE子句的结尾处。
例如:
(效率低下,执行时间为156.3秒)
选择…
从EMP E
萨尔50000
工作=经理
和25 <(从EMP中选择计数(*)
在MGR = e.empno);
(效率高,执行时间10.6秒)
选择…
从EMP E
其中25 <从EMP中选择计数(*)
在MGR = e.empno)
萨尔50000
工作=经理;
避免在SELECT子句3中使用*。
当您想列出SELECT子句中的所有列时,使用动态SQL列引用*是一种方便的方法。不幸的是,这是一种非常低效的方式。事实上,解析过程中的Oracle将被转换成所有的名称,这是通过查询数据字典来完成的,这意味着将花费更多的时间。
4。使用解码功能减少处理时间,使用解码功能,避免重复扫描同一记录或重复同一表。
5。删除重复记录
删除重复记录的最有效的方法(因为数据使用)
删除EMP
在e.rowid >(选择min(x.rowid))
从EMP X
在x.emp_no = e.emp_no);
6。计算记录数
与一般观点相反,计数(*)比计数(1)稍快,当然,如果可以通过索引检索到电缆。
枚举仍然是最快的。例如,计数(EMPNO)
7。用WHERE子句替换带子句
为了避免使用带子句,只对结果集进行过滤,直到检索到所有记录为止。
这个过程需要进行排序、总计和其他操作。如果可以通过WHERE子句限制记录的数量,可以降低成本。
例如:
效率低下
选择区域,AVG(log_size)
从位置
集团由区域
具有区域区域!=悉尼
和区域!=珀斯
高效
选择区域,AVG(log_size)
从位置
区域区域!=悉尼
和区域!=珀斯
集团由区域
有条件通常用于比较某些集函数,如计数()等。除此之外,一般条件应写在WHERE子句中。
8。减少对表的查询
在SQL语句中包含子查询,特别要注意减少表的查询。
例如:
效率低下
选择tab_name
从表
在tab_name =(选择tab_name)
从tab_columns
版本= 604)
和db_ver =(选择db_ver)
从tab_columns
版本= 604)
高效
选择tab_name
从表
在(tab_name,db_ver)
=(选择tab_name,db_ver)
从tab_columns
版本= 604)
9。使用表的别名别名
当多个表连接的SQL语句,使用表的别名和前缀别名每column.this
因此,可以减少解析时间,减少列歧义造成的语法错误。
(列歧义意味着SQL中的不同表具有相同的列名。当列出现在SQL语句中时,SQL解析器无法确定列的属性。
10。代替存在
在许多基于查询的表查询中,为了满足一个条件,常常需要加入另一个表。
在存在(或不存在)的情况下,查询的效率通常会提高。
低效率:
*选择
来自EMP(基表)
在EMPNO > 0
和部门在(SELECT DEPTNO)
从系
在LOC =公司
效率高:
*选择
来自EMP(基表)
在EMPNO > 0
存在(选择x)
从系
在dept.deptno = emp.deptno
和LOC =公司
11。而不是不存在
在子查询中,在条款的不将执行一个内部的排序和合并。在任何情况下,不在是最低效的(因为它执行的子查询表的全表遍历)。为了避免使用不在,我们可以把它改写为外部连接(外部连接)或不存在。
例如:
选择…
从EMP
在dept_no没有(选择dept_no)
从系
在dept_cat =);
为了提高效率,重写如下:
(方法1:高效率)
选择了…
来自EMP A,B部
在a.dept_no =十堰(+)
和b.dept_no是空的
和b.dept_cat(+)= A
(方法二:最有效)
选择了…
从EMP E
不存在的地方(选择x)
从部门D
在d.dept_no = e.dept_no
和dept_cat =;
12。用表连接替换
一般来说,表连接比现有的效率更高。
选择一个
从EMP E
存在(选择x)
从系
在dept_no = e.dept_no
和dept_cat =;
(更有效率)
选择一个
来自D部,EMP E
在e.dept_no = d.dept_no
和dept_cat = ';
13。用存在替换
当提交包含一对多表信息的查询(如部门表和雇员表)时,请避免选择子句。
一般来说,使用不同的。可以被认为是被存在代替的
例如:
低效率:
选择不同的dept_no,dept_n
来自D部,EMP E
在d.dept_no = e.dept_no
效率高:
选择dept_no,dept_name
从部门D
存在(选择x)
从EMP E
在e.dept_no = d.dept_no);
14。避免在索引列上使用计算
在WHERE子句中,如果索引列是函数的一部分。优化器将使用一个完整的表扫描而不使用索引。
举一个例子:uff1a
低效率:
选择…
从系
萨尔* 12>25000;
效率高:
选择…
从系
12 > 25000;
这是一个非常实际的规则,一定要牢记在心。