`
guoyanxi
  • 浏览: 271374 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

sql tuning笔记

阅读更多

#########shared pool对SQL缓存###########

Oracle会对执行过的SQL语句进行缓存,以便在下次使用相同语句的时候从缓存区直接调用,提高效率

例如以下两个语句对于oracle来说是一样的:

SELECT col1,col2

FROM table—name1

WHERE col1 > col2

AND col2 > col3

GROUP BY col1;

SELECT col1,col2

FROM table—name2

WHERE col1 > col2

AND col2 > col3

GROUP BY col2;

但是不好的风格会影响到oracle对sql语句的自动缓存

例如以下三条语句对于oracle来说都是两两不一样的:

SELECT * FROM emp;

select * from emp;

Select * From emp;

这样,oracle将分开三次解释以上语句。这样,效率就降低了

建议:关键词、保留字都保证代码是大写的,在语句当中去掉多余的空格。长的语句保持一个子句一行,以免造成换行的溢出(默认一行80列)。


#########WHERE子句与FROM子句###########

以以下两个表为例:

STUDENT表:
SID    学号
SNAME    姓名
SEX    性别

DEPARTMENT表:
DID    院系ID
DNAME    院系名

如果要对STUDENT表查询:
SELECT *
FROM STUDENT
WHERE SID='001'
AND SNAME='Tom'
AND SEX='male';

oracle是按照从后到前的步骤对WHERE子句进行处理

那么oracle将按照以下步骤进行查询
1.把所有男生找出来
2.针对上一步结果,把所有叫Tom人找出来
3.针对上面的结果,把所有SID为001的人找出来

相信大家都明白,在这里,如果想提高SQL查询的效率,我们应该先把尽量精确的子集选出来(例子中的SID)
然后两步的操作自然高效了,例如:

SELECT  *
FROM STUDENT
WHERE SEX='male'
AND SNAME='Tom'
AND SID='001';

同样的,对FROM子句也是从后到前进行处理

所以以上例子如果涉及到两个表的关连查询,那么应该把DEPARTMENT表排在后面
这样能够让更小的子集参与下一步的查询

建议:在FROM子句中,把记录条数少的放在最后
在WHERE子句中,把区分度最大的字段放在最后,如果区分度相约,则使用建立索引的字段

分享到:
评论
2 楼 guoyanxi 2010-10-15  
volkswageos 写道
sql tuning 究竟是什么东西啊?

sql调优,performance tuning一种
1 楼 volkswageos 2010-10-09  
sql tuning 究竟是什么东西啊?

相关推荐

Global site tag (gtag.js) - Google Analytics