前几天,一个用户找到我,说查一个小表的时候非常慢,我问有多慢,他说最快也得半个小时才能出结果,有时干脆不出结果,我说小表多大,他说就几十兆,有点疑惑,让他帮忙获取了相关信息,一看就明白了,原来所谓的小表是“假”的,下面是分析时参照的信息及分析的步骤。

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秒出结果,征求用户意见,用户说这样可以,至此问题解决,大家可以参照学习,禁止转载。

转载于:https://www.cnblogs.com/lhdz_bj/p/8681492.html

十分钟释疑Oracle中“小表超慢”之谜(SQL调优/SQL优化)相关推荐

  1. java弱引用怎么手动释放,十分钟理解Java中的弱引用,十分钟java引用

    十分钟理解Java中的弱引用,十分钟java引用 本篇文章尝试从What.Why.How这三个角度来探索Java中的弱引用,帮助大家理解Java中弱引用的定义.基本使用场景和使用方法.由于个人水平有限 ...

  2. oracle r修改表名,oracle中修改表名

    <<>> answer1: ALTER TABLE old_table_name RENAME TO new_table_name;(大写为系统命令) answer2: SQL ...

  3. 【DB笔试面试592】在Oracle中,表和表之间的关联方式有哪几种?

    ♣题目 部分 在Oracle中,表和表之间的关联方式有哪几种? ♣答案部分 目前为止,无论连接操作符如何,典型的连接类型共有3种: ① 排序合并连接(Sort Merge Join,简称SMJ),Or ...

  4. 【DB笔试面试593】在Oracle中,表的访问方式有哪几种?

    ♣题目 部分 在Oracle中,表的访问方式有哪几种? ♣答案部分 访问表的方式也叫优化器访问路径,主要有3种访问路径:全表扫描(FULL TABLE SCAN,FTS).索引扫描(INDEX SCA ...

  5. Oracle中多表联合更新处理方法详解

    ORACLE中多表关联更新与SQL Server和MYSQL的语法稍有不同,现将ORACLE中多表关联更新的几种方法处理如下: 一.创建测试表和添加测试数据 CREATE TABLE t_test01 ...

  6. Oracle中多表查询再按时间倒序

    我在工作中在Oracle中多表查询再按时间倒序时,用order by 表名.datatime desc 总是实现不了. 不过最后问杨鹃最后和我说可以把我们查询的总个sql语句做为一个表来排序: sel ...

  7. oracle中删除表的四种基本操作 2021-11-03

    oracle中删除表的四种基本操作: drop table 表名 delete from 表名 truncate table 表名 在PL/SQL中,选中要删除的表,右键,选drop

  8. oracle中设置表的主键字段为自增序列(实例)

    oracle中设置表的主键字段为自增序列(实例) 1.首先创建一个表(如日志表) //删除库表中存在的日志表 drop table S_LOG_INFO cascade constraints; // ...

  9. oracle避免回表,请教大家: 经常在sql调优过程中提到避免“回表”,具体是指什么意思???3Q...

    你的位置: 问答吧 -> Oracle -> 问题详情 请教大家: 经常在sql调优过程中提到避免"回表",具体是指什么意思???3Q 如题,不甚感激!!!! [ 本帖 ...

最新文章

  1. tf.contrib.layers.fully_connected详解
  2. makefile文件的书写规则(make和makefile)
  3. C++ Websites
  4. 稳定性测试怎么做,这篇文章彻底讲透了
  5. VS 2010 快捷键
  6. html如何算小于0判断错误,报错提示:直筋长度的计算结果小于0,计算公式为......
  7. ArcGIS基本使用介绍
  8. scrapy-redis 和 scrapy-splash结合 做分布式渲染爬取
  9. Codeforces 553A Kyoya and Colored Balls 给球涂颜色
  10. No input file specified. Nginx PHP
  11. ntds(600)ntdsa:系统错误1453配额不足及恢复过程记录
  12. Java实习生常规技术面试题每日十题Java基础(四)
  13. Python爬虫入门教程 95-100 帮粉丝写Python爬虫之【全网通用评论爬虫】
  14. Tensorflow2.0 自定义网络
  15. linux内核软盘,软盘也成为历史文物了:Linux内核也将取消软盘驱动器的支持
  16. 汇编语言——汇编指令长度的判断
  17. 嵌入式开发基于linux系统的c语言程序开发调试工具
  18. Youtube时长预估
  19. 解决 el-input 密码输入框浏览器自动填充账号密码问题
  20. EXP-00091 Exporting questionable statistics.

热门文章

  1. vue过滤器的那点事
  2. 零基础转行自学前端,怎么学习更系统?
  3. Web前端入门学习之JS基础知识梳理汇总
  4. ERROR 1064 (42000): ; check the manual that corresponds to y
  5. python 事务操作_Python实现连接mysql数据库及事务处理【冰斌棒】
  6. 用qpst修复手机服务器禁用,QPST工具包没有qfil怎么办?
  7. 动态加载html 添加样式表,使页面动态加载不同CSS样式表,从而实现不同风格模板的方法...
  8. html外联内联,HTML内联元素
  9. 荣威i5能升级鸿蒙系统吗,荣威i5更新系统方法
  10. linux 共享内存为分配,Linux在x86_64上共享内存分配