收藏私塾在线
 

欢迎您来到私塾在线网!   

请登录! 

威尼斯人线上赌博注册 

交流首页 » 数据库 »SQL的简易优化 》》》》 抢沙发  XML
发表人 内容
woaijiadanoo
[头像]

交流经验:
总积分:60204
级别:VIP5
注册时间: 2011-10-19
文章: 201
离线

2. 选择最有效率的表名顺序(只在基于规则的优化器中有效) 
ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理. 在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.当ORACLE处理多个表时, 会运用排序及合并的方式连接它们.首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并.
例如: 表 TAB1 16,384 条记录
表 TAB2 1 条记录
选择TAB2作为基础表 (最好的方法)
select count(*) from tab1,tab2 执行时间0.96秒
选择TAB2作为基础表 (不佳的方法)
select count(*) from tab2,tab1 执行时间26.09秒
如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.
例如: EMP表描述了LOCATION表和CATEGORY表的交集.
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 1000 AND 2000
3. WHERE子句中的连接顺序.
ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.
例如:
(低效,执行时间156.3秒)
SELECT …
FROM EMP E
WHERE SAL > 50000
AND JOB = ‘MANAGER’
AND 25 < (SELECT COUNT(*) FROM EMP
WHERE MGR=E.EMPNO);
(高效,执行时间10.6秒)
SELECT …
FROM EMP E
WHERE 25 < (SELECT COUNT(*) FROM EMP
WHERE MGR=E.EMPNO)
AND SAL > 50000
AND JOB = ‘MANAGER’;






------------------------------------------------------------------ 未完待续 ----------------------------------------------------------------------- 


个性签名:没有色彩的生活中,容易失去寻找快乐的动力
woaijiadanoo
[头像]

交流经验:
总积分:60204
级别:VIP5
注册时间: 2011-10-19
文章: 201
离线

4. SELECT子句中避免使用 ‘ * ‘ 
当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 ‘*’ 是一个方便的方法.不幸的是,这是一个非常低效的方法. 实际上,ORACLE在解析的过程中, 会将’*’ 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间.

5. 减少访问数据库的次数
当执行每条SQL语句时, ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等等. 由此可见, 减少访问数据库的次数 , 就能实际上减少ORACLE的工作量.
例如,
以下有三种方法可以检索出雇员号等于0342或0291的职员.
方法1 (最低效)
SELECT EMP_NAME , SALARY , GRADE
FROM EMP
WHERE EMP_NO = 342;
SELECT EMP_NAME , SALARY , GRADE
FROM EMP
WHERE EMP_NO = 291;
方法2 (次低效)
DECLARE
CURSOR C1 (E_NO NUMBER) IS
SELECT EMP_NAME,SALARY,GRADE
FROM EMP
WHERE EMP_NO = E_NO;
BEGIN
OPEN C1(342);
FETCH C1 INTO …,..,.. ;
OPEN C1(291);
FETCH C1 INTO …,..,.. ;
CLOSE C1;
END;
方法3 (高效)
SELECT A.EMP_NAME , A.SALARY , A.GRADE,
B.EMP_NAME , B.SALARY , B.GRADE
FROM EMP A,EMP B
WHERE A.EMP_NO = 342
AND B.EMP_NO = 291;
注意:
在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量 ,建议值为200.


-------------------------------------- 连载中 ---------------------------------------------- 


个性签名:没有色彩的生活中,容易失去寻找快乐的动力
woaijiadanoo
[头像]

交流经验:
总积分:60204
级别:VIP5
注册时间: 2011-10-19
文章: 201
离线

 。。。。。字数限制的有点厉害,总是提交不了,有兴趣的去看我的威尼斯人娱乐平台吧


个性签名:没有色彩的生活中,容易失去寻找快乐的动力
nices
[头像]

交流经验:
总积分:1037
级别:普通会员
注册时间: 2011-10-19
文章: 87
离线

大哥,你用的是oracle 9I的吧,oracle 10g的已经解决了这个问题了,解析现在不是反过来的


个性签名:从have到how到why的过程
woaijiadanoo
[头像]

交流经验:
总积分:60204
级别:VIP5
注册时间: 2011-10-19
文章: 201
离线

呵呵   你说的反过来  是因为使用的解析器不同,  上面的优化大部分都是针对RBO(规则优化),现在10g对CBO (资源优化)进行了调整以后   确实解决了很多问题, 但是这么讲就要联系太多了 ,   所以只是在给提供个参考而已   O(∩_∩)O~

这篇文章被编辑了 1 次. 最近一次更新是在 2011-10-20 14:53:57



个性签名:没有色彩的生活中,容易失去寻找快乐的动力
nices
[头像]

交流经验:
总积分:1037
级别:普通会员
注册时间: 2011-10-19
文章: 87
离线

你认为索引一般是在什么场景下去用的?如果是专门用来查询表用的话,这个我感觉理解太浅了


个性签名:从have到how到why的过程
woaijiadanoo
[头像]

交流经验:
总积分:60204
级别:VIP5
注册时间: 2011-10-19
文章: 201
离线

呵呵,索引的一个前提就是让一个索引尽可能多的区别出数据。 理论上,索引越多 查询的也就越快。不过相对的,在插入 修改和删除的时候 维护的时间也就越多。关键的就是掌握这个度 拿我来说,我接触过的最大的表是一亿七千多万的数据,在这个表上,对于全表 就只给了一个唯一索引,但是创建分区,并且在分区的节点上创建了分区索引,这样就找到了一个 维护和查询的平衡 如果有机会 不妨探讨下 O(∩_∩)O~


个性签名:没有色彩的生活中,容易失去寻找快乐的动力
nices
[头像]

交流经验:
总积分:1037
级别:普通会员
注册时间: 2011-10-19
文章: 87
离线

恩,我应该见过你,不知道是不是你 啊


个性签名:从have到how到why的过程
woaijiadanoo
[头像]

交流经验:
总积分:60204
级别:VIP5
注册时间: 2011-10-19
文章: 201
离线

O(∩_∩)O~ 是吗? 我平时有时间就往那边串


个性签名:没有色彩的生活中,容易失去寻找快乐的动力
 
交流首页 » 数据库
前往:   

关于我们 | 联系我们 | 用户协议 | 私塾在线服务协议 | 版权声明 | 隐私保护

版权所有 Copyright(C)2009-2012 私塾在线学习网

博聚网
博聚网