分区表SQL TUNING时容易“被欺骗”的场景之一
来源:互联网 发布:路飞 知乎 编辑:程序博客网 时间:2024/05/16 16:58
近几天没有用户找到,除了看看书,就是上网浏览点东西,好不惬意。可惜好景不长,正在享受悠闲惬意的日子时,一个用户的工作人员QQ找到我,说他们在统计一些数据,但一个SQL特别慢,或者说就从来没出过数据,我说,SQL操作的表很大吗?他说,很大,但我们已经对表进行了分区,而且我们就取10分钟的数据,但还是这么慢。听到用户这么说,我放下手里的书,想了想,还是感觉有点奇怪,于是向用户要了他们的SQL,很简单的一个SQL语句,如下:
select distinct rec_no from rec_log
where rec_date >= sysdate - 1 / 144
and rec_date < sysdate;
嗯,确实如用户所说,看到这个分区表相关的SQL,虽然能确定两个可能的因素,但不能确定到底什么具体因素导致了这个SQL如此之慢,我们做SQL TUNING,最先想到的是执行计划,用户用他们常用的工具取了执行计划,给我发了过来,虽然信息不是很全,先看看再说,如下:
看了这个计划,大家可能就稍微清楚点了,原因是扫描了该表的所有分区,而且没有走索引,由用户抱怨一直没出过结果,可以判断,这个表可能很大,而且分区粒度也可能较大,后来问用户,确定整张表近1T,那么,为什么既没走索引,也没走分区剪裁呢?于是,问用户,分区键是rec_date吗?用户说是,整个过程中,我向用户核实了好几遍,他说分区键是rec_date,看这个字段的名字,也像是个分区键,于是不好再询问。先看看索引情况再说,于是,让用户反馈了该表上索引的情况:
select table_name,index_name,column_name from user_ind_columns where table_name='REC_LOG';
table_name index_name column_name
------------------- ---------------------- -----------
REC_LOG IDX_REC_DATE REC_DATE
REC_LOG PK_REC_LOG REC_ID
...
这个rec_date上还有索引,而且经过进一步查询,这还是个global索引,那么,既然有索引,rec_date还是分区键,为什么既没走索引,也没走分区剪裁呢?有些奇怪,最后还是让用户给了这个表的建表SQL,如下:
create table REC_LOG
(
REC_ID NUMBER not null,
CREATE_DATE DATE,
REC_COMMENT VARCHAR2(500),
REC_IMAGE BLOB,
REC_STAT NUMBER default 0,
REC_DATE DATE
REC_NO NUMBER
)
partition by range (CREATE_DATE)
...
至此,真相大白,用户记错了,我们也被这个字段的名字蒙蔽了,因此,系统扫描所有分区也是没办法的事儿。那么,既然在rec_date上有global索引,为什么没走呢?我们不得而知。。。让小比例收集了统计信息后,该SQL执行计划依然不变,最后,只能加hint试试:
select /*+ index(r idx_rec_date) */distinct rec_no from rec_log r
where rec_date >= sysdate - 1 / 144
and rec_date < sysdate;
加hint后执行计划改变,如下:
看了执行计划,知道性能不会太差,让用户跑了一下,6~7s出结果,征求了下用户的意见,说加hint可以,因为他们就是统计下数据,否则,对高版本的oracle,可以采取其他办法搞定,至此,问题解决,大家可以参照学习,禁止转载。
- 分区表SQL TUNING时容易“被欺骗”的场景之一
- 优化案例 | 分区表场景下的SQL优化
- 优化案例 | 分区表场景下的SQL优化
- sql tuning的步骤
- SQL优化(SQL TUNING)可大幅提升性能的实战技巧之一——让计划沿着索引跑
- SQL Tuning
- SQL Tuning
- SQL Tuning
- 容易忘记的sql
- 一个容易出现死锁的场景
- iOS容易造成循引用的场景
- iOS容易造成循引用的场景
- iOS 容易造成循环引用的场景
- MongDB 的适用场景之一
- SQL tuning 类 的面试题
- tuning 11--SQL Statement Tuning
- MSSQL2012中SQL调优(SQL TUNING)时CBO支持和常用的hints
- SQL SERVER 分区表的总结--分区表的维护和管理
- MongoDB 与 CouchDB 全方位对比
- C/C++内存知识(四)
- 验证手机号码
- IOS的OpenGL基础
- 在centos上安装php5.5+MySQL 5.5.32
- 分区表SQL TUNING时容易“被欺骗”的场景之一
- VIM 配置详解
- 正则表达式和 Java I/O
- Quartz+Spring 实例 配置
- 需要 StringTokenizer 吗?
- JSP之c:foreach
- c语言 运行cmd 查询某个文件夹内文件名并且输出
- Java I/O的总结
- 程序员面试100题---4.在二元树中找出和为某一值的所有路径(树)