您当前位置:优侠库 > 资讯攻略 >
来源:未知
2021-07-04 22:45:57 浏览: 分类:资讯攻略

Oracle语句优化规则详解

1.选择合适的oracle优化器。

ORACLE有三种优化器:

A.规则(基于规则)

B.成本(基于成本)

C.选择(可选)

设置默认的优化器,可以通过init.ora文件中OPTIMIZER_MODE参数的各种声明来覆盖,比如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS。当然也可以在SQL语句级或者会话级覆盖。

为了使用CBO(基于成本的优化器),您必须经常运行analyze命令来提高数据库中对象统计信息的准确性。

如果数据库的优化器模式设置为CHOOSE,那么实际的优化器模式将与analyze命令是否已经运行有关。如果表已经被分析,优化器模式将自动变成CBO,否则,数据库将采用规则形式的优化器。

默认情况下,ORACLE使用CHOOSE优化器。为了避免不必要的全表扫描,您必须尽量避免使用CHOOSE优化器,而直接使用基于规则或基于成本的优化器。

2.访问表的方法ORACLE使用两种方法来访问表中的记录:

A.全表扫描

全表扫描是按顺序访问表中的每条记录。ORACLE通过一次读取多个数据库块来优化全表扫描。

B.通过ROWID访问表

您可以使用基于ROWID的访问方法来提高访问表的效率。ROWID包含表& hellip中记录的物理位置信息& hellipORACLE使用索引来实现数据和存储数据的物理位置(ROWID)之间的连接。通常,索引提供了一种快速访问ROWID的方法,因此可以提高基于索引列的查询的性能。

3.共享SQL语句

为了不重复解析同一个SQL语句,在第一次解析之后,ORACLE将SQL语句存储在内存中。系统全局区SGA(system global area)中的共享缓冲池中的内存可以由所有数据库用户共享。因此,当您执行一条SQL语句(有时称为游标)时,如果与之前执行的语句完全相同,ORACLE可以快速获得解析后的语句和最佳执行路径。ORACLE的这个功能大大提高了SQL的执行性能,节省了内存的使用。

遗憾的是,ORACLE只为简单表提供缓存,不适合多表连接查询。

数据库管理员必须在init.ora中为这个区域设置合适的参数,当这个内存区域越大,可以保存的语句就越多,当然被共享的可能性也就越大。

当您向ORACLE提交SQL语句时,ORACLE将首先在内存中查找相同的语句。

这里需要注意的是,ORACLE在两者之间采用了严格的匹配。为了实现共享,SQL语句必须相同(包括空大小写、换行符等)。).

共享语句必须满足三个条件:

A.人物级别对比:

当前执行的语句和共享池中的语句必须相同。

例如:

SELECT * FROM EMP

而以下每一条都是不同的。

SELECT * from EMP

Select * From Emp

SELECT * FROM EMP

B.两个语句中引用的对象必须完全相同:

例如:

如何访问用户名?

Jack sal_limit私有同义词

工作城市公共同义词

Plant_detail公共同义词

Jill sal_limit私有同义词

工作城市公共同义词

工厂_明细表所有者

考虑以下SQL语句是否可以在两个用户之间共享。

SQL为什么可以共享?

从sal_limit中选择max(sal _ cap);每个用户不可能有一个私有的同义词——sal _ limit,他们是不同的对象。

select count(*0 from work_city,其中sdesc喜欢“NEW %”;两个用户可以访问同一个对象公共同义词-work_city。

Select a. sdesc,b. location from work _ city a,plant_detail b其中a. city _ id = b. city _ id。用户jack不能通过私有同义词访问plant _ detail而jill是表的所有者,对象是不同的。

C.两个SQL语句中必须使用同名的绑定变量。

例如,第一组中的两个SQL语句是相同的(可以共享),而第二组中的两个语句是不同的(即使在运行时,不同的绑定变量被赋予相同的值)。

a.

select pin,name from people其中pin =:bl k1 . pin;

select pin,name from people其中pin =:bl k1 . pin;

b.

select pin,name from people其中pin =:bl k1 . ot _ ind;

select pin,name from people其中pin =:bl k1 . ov _ ind;

4.选择最有效的表名顺序(仅在基于规则的优化器中有效)

ORACLE的解析器从右到左处理FROM子句中的表名,所以FROM子句中写入的最后一个表(基本表驱动表)将首先被处理。当FROM子句包含多个表时,必须选择记录数最少的表作为基表。当ORACLE处理多个表时,它通过排序和合并来连接它们。首先,扫描第一个表(FROM子句中的最后一个表)并对记录进行排序,然后扫描第二个表(FROM子句中的最后一个表),最后将从第二个表中检索到的所有记录与第一个表中的相应记录合并。

例如:

表1 16,384条记录

表2 1记录

选择TAB2作为基表(最佳方法)

从tab1中选择(*),tab2的执行时间为0.96秒。

选择TAB2作为基表(错误的方法)

从tab2中选择(*),tab1的执行时间是26.09秒

如果有三个以上的表要加入查询,就需要选择交集表作为基表,引用其他表引用的表。

例如,EMP表描述了位置表和类别表的交集。

选择*

从位置L,

C类,

员工E

在EN 1000和2000年之间

并且E .目录号= C .目录号

LOCN = LOCN

将比下面的SQL更有效

选择*

来自EMP E,

位置L,

C类

其中E .目录号= C .目录号

LOCN = LOCN

以及EN 1000和2000年之间的电磁脉冲

5.WHERE子句中的连接顺序。

ORACLE以自下而上的顺序解析WHERE子句。根据这个原则,表与表之间的连接必须写在其他WHERE条件之前,那些能筛选出最大记录数的条件必须写在WHERE子句的末尾。

例如:

(低效,执行时间156.3秒)

选择& hellip

来自EMP E

其中SAL & gt50000

而JOB = & lsquo经理& rsquo

和25 & lt(从EMP中选择COUNT(*)

其中MGR = E . EMPNO);

(高效,执行时间10.6秒)

选择& hellip

来自EMP E

其中25 & lt(从EMP中选择COUNT(*)

其中MGR=E.EMPNO)

和SAL & gt50000

而JOB = & lsquo经理& rsquo;

6.避免使用& lsquo在SELECT子句中* & rsquo

当您想要列出SELECT子句中的所有列时,请使用动态SQL列引用& lsquo* & rsquo这是一种方便的方法。不幸的是,这是一个非常低效的方法。其实在解析的过程中,甲骨文会把& lsquo* & rsquo依次转换为所有列名,这是通过查询数据字典来完成的,这意味着需要更多的时间。

7.减少访问数据库的次数

在执行每条SQL语句时,ORACLE都会执行大量的内部工作:解析SQL语句、估计索引的利用率、绑定变量、读取数据块等等。因此,减少数据库访问次数实际上可以减少ORACLE的工作量。

例如,有三种方法可以检索雇员编号等于0342或0291的雇员。

方法1(效率最低)

SELECT员工姓名,薪金,级别

来自电磁脉冲

其中EMP _ NO = 342

SELECT员工姓名,薪金,级别

来自电磁脉冲

其中EMP _ NO = 291

方法2(第二种效率低)

声明

光标C1 (E_NO编号)是

SELECT员工姓名,薪金,级别

来自电磁脉冲

其中EMP_ keyword标签:Oracle

优侠库网站每天提供最新最热门的安卓手机软件、游戏下载、分享热门手游资讯攻略教程、手机软件教程步骤,专注安卓手机游戏软件下载。

本文链接:http://www.123down.cn/gonglue/227134.html

攻略资讯
安卓软件
安卓游戏