开发者社区> 问答> 正文

阿里云数据库优化SQL调优

性能优化/故障排除/长期代维     云库管   www.yundba.com


ORACLE\SQL调优\阿里云
《阿里云ORACLE优化》 文章中最后一部分未展开,先用我多年前写的一篇文章来补充吧





下面的文章原本不是测试的主题,但为给后面的兄弟们节省点时间,我还是忍不住的记录了一下了!


解答阿里云oracle用户的顾虑    http://bbs.aliyun.com/read/235209.html?spm=5176.7189909.0.0.wBcJnu



sql调优工具-mytun之十年磨一剑    http://bbs.aliyun.com/read/181774.html?spm=0.0.0.0.4ePRRO


阿里云linux5.7安装oracle必读       http://bbs.aliyun.com/read/180238.html?spm=0.0.0.0.DWXVj6


阿里云的oracle故障解决案例                  http://bbs.aliyun.com/read/181057.html?spm=0.0.0.0.DWXVj6


阿里云linux安装oracle常见问题         http://bbs.aliyun.com/read/180907.html?spm=0.0.0.0.DWXVj6


阿里云ORACLE优化                      http://bbs.aliyun.com/read/181443.html?spm=0.0.0.0.LX9qeR


阿里云数据库迁移方案-不间断业务   http://bbs.aliyun.com/read/181568.html?spm=0.0.0.0.wiBrUZ


ORACLE数据库健康检查脚本下载--干货  http://bbs.aliyun.com/read/182376.html?spm=0.0.0.0.xUovF8








一次隐藏较隐蔽的SQL优化问题----不要轻易的忽视count(列) 2006-12-24 17:14:12

原创 qq: 123614791
http://blog.itpub.net/8494287/viewspace-886337 /

1. 场景说明:

stockpile ----IC卡的供求信息
xh-- 型号-----字符型
xh 列是 可为null的


index SP_XH, 是函数index, 定义如下create index SP_XH on stockpile (upper(xh));
注意:
( xh 列是 可为null的,会多读一次表
如果xh上带not null 的约束,只读index 不读表 )
高频度查询SQL
select /*+ INDEX(s SP_XH) */ count(s.xh)
from stockpile s
where upper(s.xh) like 'TL431%'
COUNT(S.XH)
-----------
186875


2. 问题出现:


读完index SP_XH 统计出数量后, 为何有多读一次STOCKPILE, 幸好它对性能的恶化程度还不算非常厉害,


select /*+ INDEX(s SP_XH) */ count(s.xh)
from stockpile s
where upper(s.xh) like 'TL431%'
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=HINT: FIRST_ROWS (Cost=272 Card=1Bytes=14)
1 0 SORT (AGGREGATE)
2 1 TABLE ACCESS (BY INDEX ROWID) OF 'STOCKPILE' (Cost=272 Card=284 Bytes=3976)
3 2 INDEX (RANGE SCAN) OF 'SP_XH' (NON-UNIQUE) (Cost=3 Card=284)
3. 分析解决:


a. 这个sql如果用count(*), 只读 index SP_XH { upper(s.xh) } , 不读表 。
b. 如果用 count(s.xh) , s.xh的数据只有在表中有 , 对应的index SP_XH { upper(s.xh) } 没有, 为排除s.xh空值影响, 所以读完index还要读表。
注解: <列> 与 某 function(列) 之间, ORACLE不能够 根据 其中一个判断另一个是否为NULL, 例如 function 是NVL(列, '1'), DECODE(列, NULL, '1', '2',NULL) 或是自定义函数, 根据函数处理后的列值-----> 不能判断 最初的<列> 是否为NULL。


c. 如改写成 count( upper(s.xh)) 一样可以只读index不读表。
select /*+ INDEX(s SP_XH) */ count( upper(s.xh))
from stockpile s
where upper(s.xh) like 'TL431%'


4. 回顾:
a. 函数index 中 存贮的是: 函数处理列后的值 和 行rowid。


b. 当xh 列是 可为null的,count(列) 出现, 走的又是 列的函数index, count(列)会多读一次表。
c. 当xh列上带not null 的约束, 只读index不读表。
d. count(列)出现时, 要看一下这对业务来说是否真的有必要, 如果只是程序员的一个书写习惯,不要轻易的忽视它。
原创 qq: 123614791
[@more@]





















展开
收起
oracle数据库技术支持www.yunDBA.com 2014-11-05 11:27:30 13237 0
1 条回答
写回答
取消 提交回答
  • 嗯,发觉有很多同事就喜欢Count(列)。 另外还有一种写法: Count(1),跟Count(*)比较不知道如何?
    2014-11-05 18:27:04
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
2022 DTCC-阿里云一站式数据库上云最佳实践 立即下载
云时代的数据库技术趋势 立即下载
超大型金融机构国产数据库全面迁移成功实践 立即下载