今天帮助看了一个哥们的数据库,帮他抓了一下等待事件,刚好有一个sql在等待事件中,顺便看看

监控等待事件

  1. select
  2. a.SID,
  3. a.EVENT,
  4. b.OSUSER,
  5. b.username,
  6. b.MACHINE,
  7. b.PROGRAM,
  8. b.MODULE,
  9. b.SQL_ID,
  10. b.sql_id
  11. from v$session_wait a, v$session b
  12. where a.sid = b.sid
  13. and a.sid in (select sid
  14. from v$session_wait
  15. where event not like 'SQL%'
  16. and event not like '%message%'
  17. and event not like 'Streams AQ%'
  18. and event not in ('jobq slave wait',
  19. 'class slave wait',
  20. 'DIAG idle wait',
  21. 'pmon timer',
  22. 'ASM background timer',
  23. 'smon timer'))
  24. select * from v$sql where sql_id='sql_id';

有问题的sql如下

  1. SELECT count(*) AS rown
  2. FROM (
  3. select t.KSGCXH,t.LSH,t.KSKM,t.KSXM,t.KSXH,t.XMKSXH,t.ZP,
  4. t.CS,to_char(t.ZPSJ,'yyyy-mm-dd hh24:mi:ss') ZPSJ,
  5. to_char(t.XTZPSJ,'yyyy-mm-dd hh24:mi:ss') XTZPSJ,
  6. t.CQBJ,t.JYW,t.FZJG,
  7. dbms_lob.getlength(zp) zplen
  8. from MON_ADMIN.DRV_MON_EXAM_PHOTO t
  9. where t.Fzjg='辽F'
  10. and zp is not null
  11. and dbms_lob.getlength(zp)<204800
  12. and t.cqbj=''
  13. and t.Xtzpsj>to_date('2015-09-17 10:38:22','yyyy-mm-dd hh24:mi:ss')
  14. and t.Xtzpsj<=to_date('2015-09-17 11:08:11','yyyy-mm-dd hh24:mi:ss')) pagetable

这个sql超级简单,就是简单的查询,连个多表连接都没有,运行4s,返回7行数据

那问题一看就是没有建立索引,并且全表扫描了

查看索引信息,发现现有的索引跟他鸟关系都没有

  1. select * from dba_indexes where owner='MON_ADMIN' and table_name='DRV_MON_EXAM_PHOTO';
  2. select t.*,i.index_type from dba_ind_columns t,dba_indexes i where t.index_name = i.index_name and
  3. owner='MON_ADMIN' and t.table_name='DRV_MON_EXAM_PHOTO';

查看一下这个表的执行计划

  1. SQL> select * from table(dbms_xplan.display);
  2.  
  3. PLAN_TABLE_OUTPUT
  4. ------------------------------------------------------------------------------------------------------------------------------------------------------------------
  5. Plan hash value: 2462891873
  6.  
  7. -----------------------------------------------------------------------------------------
  8. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
  9. -----------------------------------------------------------------------------------------
  10. | 0 | SELECT STATEMENT | | 1 | 101 | 29460 (1)| 00:05:54 |
  11. | 1 | SORT AGGREGATE | | 1 | 101 | | |
  12. |* 2 | TABLE ACCESS FULL| DRV_MON_EXAM_PHOTO | 1 | 101 | 29460 (1)| 00:05:54 |
  13. -----------------------------------------------------------------------------------------
  14.  
  15. Predicate Information (identified by operation id):
  16. ---------------------------------------------------
  17.  
  18. 2 - filter("T"."XTZPSJ">TO_DATE(' 2015-09-17 10:38:22', 'syyyy-mm-dd
  19. hh24:mi:ss') AND "T"."FZJG"='辽F' AND "DBMS_LOB"."GETLENGTH"("ZP")<204800 AND
  20. "T"."CQBJ"='' AND "T"."XTZPSJ"<=TO_DATE(' 2015-09-17 11:08:11', 'syyyy-mm-dd
  21. hh24:mi:ss'))
  22.  
  23. 已选择17行。

果然走了全表扫描,查询这个表的总行数有5017932行,查询体积为896M

结果集返回7条数据,那么7/5017932约等于0,相当于全表扫描每一行数据才能找到这七条数据

我们知道全表扫描是多快读,读取1M的数据大概15ms,全读完大概13s,现在用时4s,看来还是很快的哦。哈哈哈

现在就是建立索引就可以解决问题

create index IDX_DRV_MON_EXAM_PHOTO3 on  MON_ADMIN.DRV_MON_EXAM_PHOTO(Fzjg,cqbj,Xtzpsj,KSGCXH,LSH,KSKM,KSXM,KSXH,XMKSXH,CS,ZPSJ,JYW);

创建完索引之后再看执行计划

  1. SQL> select * from table(dbms_xplan.display);
  2.  
  3. PLAN_TABLE_OUTPUT
  4. ------------------------------------------------------------------------------------------------------------------------------------------------------------------
  5. Plan hash value: 2782271437
  6.  
  7. --------------------------------------------------------------------------------------------------------
  8. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
  9. --------------------------------------------------------------------------------------------------------
  10. | 0 | SELECT STATEMENT | | 1 | 101 | 4 (0)| 00:00:01 |
  11. | 1 | SORT AGGREGATE | | 1 | 101 | | |
  12. |* 2 | TABLE ACCESS BY INDEX ROWID| DRV_MON_EXAM_PHOTO | 1 | 101 | 4 (0)| 00:00:01 |
  13. |* 3 | INDEX RANGE SCAN | IDX_DRV_MON_EXAM_PHOTO3 | 1 | | 3 (0)| 00:00:01 |
  14. --------------------------------------------------------------------------------------------------------
  15.  
  16. Predicate Information (identified by operation id):
  17. ---------------------------------------------------
  18.  
  19. 2 - filter("DBMS_LOB"."GETLENGTH"("ZP")<204800)
  20. 3 - access("T"."FZJG"='辽F' AND "T"."CQBJ"='' AND "T"."XTZPSJ">TO_DATE(' 2015-09-17
  21. 10:38:22', 'syyyy-mm-dd hh24:mi:ss') AND "T"."XTZPSJ"<=TO_DATE(' 2015-09-17 11:08:11',
  22. 'syyyy-mm-dd hh24:mi:ss'))
  23.  
  24. 已选择18行。

执行计划变成了索引范围扫描

运行时间有4s编程现在的0.03s,绝对秒杀

对于这种单表运行速度慢,主要看有没有建立索引。

建索引让SQL飞起来的更多相关文章

  1. Mysql索引,有哪几种索引,什么时候该(不该)建索引;SQL怎么进行优化以及SQL关键字的执行顺序

    索引(Index)是帮助MySQL高效获取数据的数据结构.提取句子主干,就可以得到索引的本质:索引是数据结构. 1.按照索引列值的唯一性,索引可分为唯一索引和非唯一索引 非唯一索引:B树索引 crea ...

  2. mysql优化 | 存储引擎,建表,索引,sql的优化建议

    个人对于选择存储引擎,建表,建索引,sql优化的一些总结,给读者提供一些参考意见 推荐访问我的个人网站,排版更好看: https://chenmingyu.top/mysql-optimize/ 存储 ...

  3. Sql Server之旅——第七站 为什么都说状态少的字段不能建索引

    我们在学sqlserver的时候,大多教科书和前辈们都说状态少的字段不要建索引,由此带来的开销还不如不建索引,但是这句话有多少人真的知道, 或者说有多少人真的对此有比较深刻的理解,而不是听别人道听途说 ...

  4. Python开发应用之-SQL 建索引的几大原则

       SQL 建索引的几大原则: 最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>.<.between.like)就停止匹配,比如a = 1 and b = ...

  5. [慢查优化]建索引时注意字段选择性 & 范围查询注意组合索引的字段顺序

    文章转自:http://www.cnblogs.com/zhengyun_ustc/p/slowquery2.html 写在前面的话: 之前曾说过"不要求每个人一定理解 联表查询(join/ ...

  6. MySQL使用索引的场景及真正利用索引的SQL类型

    1. 为什么使用索引 在无索引的情况下,MySQL会扫描整张表来查找符合sql条件的记录,其时间开销与表中数据量呈正相关.对关系型数据表中的某些字段建索引可以极大提高查询速度(当然,不同字段是否sel ...

  7. [每日一题] OCP1z0-047 :2013-07-27 外部表――不能被DML和建索引

    首先看官方文档上的解释: Managing External Tables Oracle Database allows you read-only access to data in externa ...

  8. Oracle使用并行建索引须要注意的问题

    建索引时.我们为了建索引快.会加上并行,加上并行之后.此列索引就会是并行了. 訪问有并行度的索引时,CBO可能可能会考虑并行运行.这可能会引发一些问题,如在server资源紧张的时候用并行会引起更加严 ...

  9. 数据库 基于索引的SQL语句优化之降龙十八掌(转)

    一篇挺不错的关于SQL语句优化的文章,因不知原始出处,故未作引用说明! 1 前言      客服业务受到SQL语句的影响非常大,在规模比较大的局点,往往因为一个小的SQL语句不够优化,导致数据库性能急 ...

随机推荐

  1. UVA 11928 The Busy Dog

    题意:一只狗被拴在杆子上,从起点开始按直线依次跑到给出的点最后回到起点问绕杆子几圈,逆时针为正,顺时针为负,撞到杆子输出Ouch!. 解法:用叉积判断方向,用余弦定理求出以杆子为顶点的角,加和除以2π ...

  2. [King.yue]Ext中Grid得到选择行数据的方法总结

    (1)grid.getStore().getRange(0,store.getCount());    //得到grid所有的行 (2)grid.getSelectionModel().getSele ...

  3. 介绍并扩展Fitnesse的测试模块化机制:ScenarioTable

    摘要:在验收测试框架Fitneese中,使用Scenario可以把最常用的测试步骤封装起来,从而达到模块化定义Fitnesse测试用例的能力.但Scenario仅限于封装Script测试步骤,Scri ...

  4. bzoj 1038 [ZJOI2008]瞭望塔(半平面交)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1038 [题意] 找一个最低塔高使可以看到村庄的每一个角落. [思路] 半平面交 能够看 ...

  5. 恒天云技术分享系列3 – KVM性能调优

    恒天云技术分享:http://www.hengtianyun.com/download-show-id-11.html KVM是什么 KVM 是 kernel-based Virtual Machin ...

  6. 【Hadoop代码笔记】Hadoop作业提交之客户端作业提交

    1.      概要描述仅仅描述向Hadoop提交作业的第一步,即调用Jobclient的submitJob方法,向Hadoop提交作业. 2.      详细描述Jobclient使用内置的JobS ...

  7. adb 启动失败的原因和修改adb端口号

    在我们使用Android Studio的时候,有时候就会出现adb打开失败或者启动不了的情况. adb 启动失败的原因:有其他程序占用了adb默认启动的端口号(像我就遇到过,每次只要提前启动了酷狗音乐 ...

  8. 【noip2007】树网的核

    题解: 首先我们要知道一个性质:如果有多条直径 这个核不论在哪条直径上 答案都是一样的 这样我们就可以随便找一条直径 在这条直径上枚举核的位置 并且dfs预处理maxlon[i] (i在直径上) 表示 ...

  9. ubuntu 运行android sdk 下的工具adb报bash: ./adb: No such file or directory

    运行adb出现这种错误: bash: ./adb: No such file or directory   但adb确实存在. 可能1:你用的是64位的Linux,没装32位运行时库,安装 $ sud ...

  10. linux shell-syntax error near unexpected token错误

    在windows下用记事本编写linux shell脚本后,执行遇到syntax error near unexpected token错误 问题原理:网上找了好久,找到原因,原来是回行的问题,每个系 ...