十分钟释疑Oracle中“小表超慢”之谜(SQL调优/SQL优化)
前几天,一个用户找到我,说查一个小表的时候非常慢,我问有多慢,他说最快也得半个小时才能出结果,有时干脆不出结果,我说小表多大,他说就几十兆,有点疑惑,让他帮忙获取了相关信息,一看就明白了,原来所谓的小表是“假”的,下面是分析时参照的信息及分析的步骤。
SQL语句:
select * from t_rec where rec_date>trunc(sysdate-1);
SQL计划:
------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 2011 | 318K| 892 (3)| 00:00:13 | | |
| 1 | PARTITION RANGE ITERATOR| | 2011 | 318K| 892 (3)| 00:00:13 | KEY | 21 |
|* 2 | TABLE ACCESS FULL | T_REC | 2011 | 318K| 892 (3)| 00:00:13 | KEY | 21 |
------------------------------------------------------------------------------------------------------------
表所占空间:
select sum(bytes)/1024/1024 "(MB)" from dba_extents where segment_name='T_REC';
(MB)
----------
38.675
看到这里,我有点疑惑,表确实不大,但有个线索,大家注意到没有,那就是partition,如此小的表,有必要分区吗?莫非。。。
desc t_rec
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
REC_ID NOT NULL VARCHAR2(20)
REC_NAME VARCHAR2(200)
REC_DESC CLOB
REC_DATE NOT NULL DATE
REC_CLASS NUMBER
REC_LEN NUMBER
至此,真相大白了,大家明白了吧?也许有的同学还是不明白,继续。。。
select sum(bytes)/1024/1024/1024 "(GB)" from dba_extents
where partition_name in(
select lob_partition_name from user_lob_partitions
where table_name='T_REC');
(GB)
----------
309.31425
明白了吗?呵呵,现在通过上面的信息,我们找到了”小表超慢“的原因,但这时,用户再次提出:我们怎么解决这个查询慢的问题呢?继续。。。
select index_name,table_name,column_name from user_ind_columns where table_name='T_REC'
INDEX_NAME TABLE_NAME COLUMN_NAME
------------------------------ ------------------------------ ----------------------------------------
IDX1_REC_DATE T_REC REC_DATE
IDX2_REC_ID T_REC REC_ID
因为该库为用户生产库,且该表较大,所以,决定先通过hint测试效率问题:
select /*+ index(t IDX1_REC_DATE)*/ * from t_rec t where rec_date>trunc(sysdate-1);
加hint后计划:
---------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
---------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 2011 | 318K| 912 (1)| 00:00:15 | | |
| 1 | PARTITION RANGE ITERATOR | | 2011 | 318K| 912 (1)| 00:00:15 | KEY | 21 |
| 2 | TABLE ACCESS BY LOCAL INDEX ROWID| T_REC | 2011 | 318K| 912 (1)| 00:00:15 | KEY | 21 |
|* 3 | INDEX RANGE SCAN | IDX1_REC_DATE| 2011 | | 14 (0)| 00:00:01 | KEY | 21 |
hint生效,测试2秒出结果,征求用户意见,用户说这样可以,至此问题解决,大家可以参照学习,禁止转载。
十分钟释疑Oracle中“小表超慢”之谜(SQL调优/SQL优化)的更多相关文章
- 【转】Oracle中dual表的用途介绍
原文:Oracle中dual表的用途介绍 [导读]dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录.我们可以用它来做很多事情. dual是一个虚拟表, ...
- oracle 中删除表 drop delete truncate
oracle 中删除表 drop delete truncate 相同点,使用drop delete truncate 都会删除表中的内容 drop table 表名 delete from 表名 ...
- 如何在Oracle中建立表和表空间?
1.建表空间 ORACLE中,表空间是数据管理的基本方法,所有用户的对象要存放在表空间中,也就是用户有空间的使用权,才能创建用户对象.否则是不充许创建对象,因为就是想创建对象,如表,索引等,也没有地方 ...
- 向oracle中的表插入数据的方法
向oracle中的表插入数据的方法有以下几种: 假设表名为User 第一种方法:select t.*,rowid from User t;-->点击钥匙那个标记就可向表中添加数据 第二种方法:s ...
- 十分钟理解Java中的动态代理
十分钟理解 Java 中的动态代理 一.概述 1. 什么是代理 我们大家都知道微商代理,简单地说就是代替厂家卖商品,厂家“委托”代理为其销售商品.关于微商代理,首先我们从他们那里买东西时通常不知道 ...
- Oracle中truncate表不更新last_ddl_time列
Oracle中truncate表不更新last_ddl_time列 问题描述 最近发现数据库中定时job的某张表,每天都有truncate动作,由于调整了job的interval时间,想查看last_ ...
- Oracle中SQL调优(SQL TUNING)之最权威获取SQL执行计划大全
该文档为根据相关资料整理.总结而成,主要讲解Oracle数据库中,获取SQL语句执行计划的最权威.最正确的方法.步骤,此外,还详细说明了每种方法中可选项的意义及使用方法,以方便大家和自己日常工作中查阅 ...
- Oracle SQL调优之分区表
目录 一.分区表简介 二.分区表优势 三.分区表分类 3.1 范围分区 3.2 列表分区 3.3 散列分区 3.4 组合分区 四.分区相关操作 五.分区相关查询 附录:分区表索引失效的操作 一.分区表 ...
- Oracle SQL 调优健康检查脚本
Oracle SQL 调优健康检查脚本 我们关注数据库系统的性能,进行数据库调优的主要工作就是进行SQL的优化.良好的数据架构设计.配合应用系统中间件和写一手漂亮的SQL,是未来系统上线后不出现致命性 ...
随机推荐
- RHCE6.4 rpm 安装gcc
先将gcc的iso里的Packages拷贝到根目录下,方便以后使用,再找gcc的rpm包安装: 网上说有以下依赖,需要按照一下顺序安装: rpm -ivh cpp*****.rpm rpm -ivh ...
- C# 找出泛型集合中的满足一定条件的元素 List.Wher()
在学习的过程中,发现泛型集合List<T>有一个Where函数可以筛选出满足一定条件的元素,结合Lambda表达式使用特别方便,写出来与大家分享. 1.关于Func<> Fun ...
- CSS开启硬件加速提高网站性能
国外一篇文章,有点意思,转载过来,准备尝试下~ 中文地址:http://www.cnblogs.com/yzw7489757/ 原文地址:http://blog.teamtreehouse.com/i ...
- jQuery.extend 函数使用详解
JQuery的extend扩展方法: Jquery的扩展方法extend是我们在写插件的过程中常用的方法,该方法有一些重载原型,在此,我们一起去了解了解. 一.Jquery的扩展方 ...
- MySQL定时备份数据库
一.MySQL数据备份 1.1. mysqldump命令备份数据 在MySQL中提供了命令行导出数据库数据以及文件的一种方便的工具mysqldump,我们可以通过命令行直接实现数据库内容的导出dump ...
- CASE WHEN用法
问题:假如说这个条件有一条数据不满足,那么那条数据就不会读出来,,那么,我怎么才能把它读出并且赋值为空呢 方法: SELECT `s`.*, ( CASE THEN SUM(a.total_numbe ...
- PyTorch官方中文文档:torch.Tensor
torch.Tensor torch.Tensor是一种包含单一数据类型元素的多维矩阵. Torch定义了七种CPU tensor类型和八种GPU tensor类型: Data tyoe CPU te ...
- Delphi基础-数据类型
枚举类型 Pascal程序不仅用于数值处理,还更广泛地用于处理非数值的数据.例如,性别.月份.星期几.颜色.单位名.学历.职业等. 1. 枚举类型的定义 格式: type 枚举类型标识符=(标识符 ...
- Mybatis入门看这一篇就够了
什么是MyBatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为 ...
- Splay入门解析【保证让你看不懂(滑稽)】
BST真是神奇的东西... 而且种类好多呀... 我这个蒟蒻只学会了splay orzCJ老爷,各种树都会 好好好,不说了,直接说splay. 不知道splay是啥,,你也要知道平衡树是啥... 平衡 ...