Oracle 有关SQL性能优化

访问Table的方式

全表扫描

  全表扫描就是顺序地访问表中每条记录,ORACLE采用一次读入多个数据块(databaseblock)的方式优化全表扫描

通过ROWID访问表

   ROWID包含了表中记录的物理位置信息,ORACLE采用索引实现了数据和存放数据的物理位置(ROWID)之间的联系,通常索引提供了快速访问ROWID的方法,因此那些基于索引列的查询就可以得到性能上的提高


共享SQL语句


Oracle提供对执行过的SQL语句进行高速缓冲的机制。被解析过并且确定了执行路径的SQL语句存放在SGA的共享池中。

Oracle执行一个SQL语句之前每次先从SGA共享池中查找是否有缓冲的SQL语句,如果有则直接执行该SQL语句。

可以通过适当调整SGA共享池大小来达到提高Oracle执行性能的目的。


选择最有效率的表名顺序(1)


ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 drivingtable)将被最先处理

当ORACLE处理多个表时,会运用排序及合并的方式连接它们。首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并.

只在基于规则的优化器中有效

选择最有效率的表名顺序(2)

     表 TAB1       16,384 条记录

     表 TAB2             1      条记录

     选择TAB2作为基础表 (最好的方法)

     select count(*) from tab1,tab2   执行时间0.96秒

    

    选择TAB2作为基础表 (不佳的方法)

     select count(*) from tab2,tab1   执行时间26.09秒

选择最有效率的表名顺序(3)

如果有3个以上的表连接查询, 那就需要选择交叉表(intersectiontable)作为基础表, 交叉表是指那个被其他表所引用的表.

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

将比下列SQL更有效率

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 1000AND 2000


Where子句中的连接顺序 (1)

Oracle采用自下而上的顺序解析WHERE子句。
sssssss
根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。

Where子句中的连接顺序(2)

(低效,执行时间156.3)

SELECT …

 FROM EMP E

WHERE  SAL > 50000

    AND  JOB = ‘MANAGER’

    AND  25 < (SELECT COUNT(*) FROMEMP

                         WHERE MGR = E.EMPNO)

(高效,执行时间10.6)

SELECT …

 FROM EMP E

WHERE 25 < (SELECT COUNT(*) FROMEMP

                        WHERE MGR=E.EMPNO)

    AND SAL > 50000

    AND JOB = ‘MANAGER’


未完待续。。。。。。









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值