建索引让SQL飞起来
今天帮助看了一个哥们的数据库,帮他抓了一下等待事件,刚好有一个sql在等待事件中,顺便看看
监控等待事件
- select
- a.SID,
- a.EVENT,
- b.OSUSER,
- b.username,
- b.MACHINE,
- b.PROGRAM,
- b.MODULE,
- b.SQL_ID,
- b.sql_id
- from v$session_wait a, v$session b
- where a.sid = b.sid
- and a.sid in (select sid
- from v$session_wait
- where event not like 'SQL%'
- and event not like '%message%'
- and event not like 'Streams AQ%'
- and event not in ('jobq slave wait',
- 'class slave wait',
- 'DIAG idle wait',
- 'pmon timer',
- 'ASM background timer',
- 'smon timer'))
- select * from v$sql where sql_id='sql_id';
有问题的sql如下
- SELECT count(*) AS rown
- FROM (
- select t.KSGCXH,t.LSH,t.KSKM,t.KSXM,t.KSXH,t.XMKSXH,t.ZP,
- t.CS,to_char(t.ZPSJ,'yyyy-mm-dd hh24:mi:ss') ZPSJ,
- to_char(t.XTZPSJ,'yyyy-mm-dd hh24:mi:ss') XTZPSJ,
- t.CQBJ,t.JYW,t.FZJG,
- dbms_lob.getlength(zp) zplen
- from MON_ADMIN.DRV_MON_EXAM_PHOTO t
- where t.Fzjg='辽F'
- and zp is not null
- and dbms_lob.getlength(zp)<204800
- and t.cqbj=''
- and t.Xtzpsj>to_date('2015-09-17 10:38:22','yyyy-mm-dd hh24:mi:ss')
- and t.Xtzpsj<=to_date('2015-09-17 11:08:11','yyyy-mm-dd hh24:mi:ss')) pagetable
这个sql超级简单,就是简单的查询,连个多表连接都没有,运行4s,返回7行数据
那问题一看就是没有建立索引,并且全表扫描了
查看索引信息,发现现有的索引跟他鸟关系都没有
- select * from dba_indexes where owner='MON_ADMIN' and table_name='DRV_MON_EXAM_PHOTO';
- select t.*,i.index_type from dba_ind_columns t,dba_indexes i where t.index_name = i.index_name and
- owner='MON_ADMIN' and t.table_name='DRV_MON_EXAM_PHOTO';
查看一下这个表的执行计划
- SQL> select * from table(dbms_xplan.display);
- PLAN_TABLE_OUTPUT
- ------------------------------------------------------------------------------------------------------------------------------------------------------------------
- Plan hash value: 2462891873
- -----------------------------------------------------------------------------------------
- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
- -----------------------------------------------------------------------------------------
- | 0 | SELECT STATEMENT | | 1 | 101 | 29460 (1)| 00:05:54 |
- | 1 | SORT AGGREGATE | | 1 | 101 | | |
- |* 2 | TABLE ACCESS FULL| DRV_MON_EXAM_PHOTO | 1 | 101 | 29460 (1)| 00:05:54 |
- -----------------------------------------------------------------------------------------
- Predicate Information (identified by operation id):
- ---------------------------------------------------
- 2 - filter("T"."XTZPSJ">TO_DATE(' 2015-09-17 10:38:22', 'syyyy-mm-dd
- hh24:mi:ss') AND "T"."FZJG"='辽F' AND "DBMS_LOB"."GETLENGTH"("ZP")<204800 AND
- "T"."CQBJ"='' AND "T"."XTZPSJ"<=TO_DATE(' 2015-09-17 11:08:11', 'syyyy-mm-dd
- hh24:mi:ss'))
- 已选择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);
创建完索引之后再看执行计划
- SQL> select * from table(dbms_xplan.display);
- PLAN_TABLE_OUTPUT
- ------------------------------------------------------------------------------------------------------------------------------------------------------------------
- Plan hash value: 2782271437
- --------------------------------------------------------------------------------------------------------
- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
- --------------------------------------------------------------------------------------------------------
- | 0 | SELECT STATEMENT | | 1 | 101 | 4 (0)| 00:00:01 |
- | 1 | SORT AGGREGATE | | 1 | 101 | | |
- |* 2 | TABLE ACCESS BY INDEX ROWID| DRV_MON_EXAM_PHOTO | 1 | 101 | 4 (0)| 00:00:01 |
- |* 3 | INDEX RANGE SCAN | IDX_DRV_MON_EXAM_PHOTO3 | 1 | | 3 (0)| 00:00:01 |
- --------------------------------------------------------------------------------------------------------
- Predicate Information (identified by operation id):
- ---------------------------------------------------
- 2 - filter("DBMS_LOB"."GETLENGTH"("ZP")<204800)
- 3 - access("T"."FZJG"='辽F' AND "T"."CQBJ"='' AND "T"."XTZPSJ">TO_DATE(' 2015-09-17
- 10:38:22', 'syyyy-mm-dd hh24:mi:ss') AND "T"."XTZPSJ"<=TO_DATE(' 2015-09-17 11:08:11',
- 'syyyy-mm-dd hh24:mi:ss'))
- 已选择18行。
执行计划变成了索引范围扫描
运行时间有4s编程现在的0.03s,绝对秒杀
对于这种单表运行速度慢,主要看有没有建立索引。
建索引让SQL飞起来的更多相关文章
- Mysql索引,有哪几种索引,什么时候该(不该)建索引;SQL怎么进行优化以及SQL关键字的执行顺序
索引(Index)是帮助MySQL高效获取数据的数据结构.提取句子主干,就可以得到索引的本质:索引是数据结构. 1.按照索引列值的唯一性,索引可分为唯一索引和非唯一索引 非唯一索引:B树索引 crea ...
- mysql优化 | 存储引擎,建表,索引,sql的优化建议
个人对于选择存储引擎,建表,建索引,sql优化的一些总结,给读者提供一些参考意见 推荐访问我的个人网站,排版更好看: https://chenmingyu.top/mysql-optimize/ 存储 ...
- Sql Server之旅——第七站 为什么都说状态少的字段不能建索引
我们在学sqlserver的时候,大多教科书和前辈们都说状态少的字段不要建索引,由此带来的开销还不如不建索引,但是这句话有多少人真的知道, 或者说有多少人真的对此有比较深刻的理解,而不是听别人道听途说 ...
- Python开发应用之-SQL 建索引的几大原则
SQL 建索引的几大原则: 最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>.<.between.like)就停止匹配,比如a = 1 and b = ...
- [慢查优化]建索引时注意字段选择性 & 范围查询注意组合索引的字段顺序
文章转自:http://www.cnblogs.com/zhengyun_ustc/p/slowquery2.html 写在前面的话: 之前曾说过"不要求每个人一定理解 联表查询(join/ ...
- MySQL使用索引的场景及真正利用索引的SQL类型
1. 为什么使用索引 在无索引的情况下,MySQL会扫描整张表来查找符合sql条件的记录,其时间开销与表中数据量呈正相关.对关系型数据表中的某些字段建索引可以极大提高查询速度(当然,不同字段是否sel ...
- [每日一题] OCP1z0-047 :2013-07-27 外部表――不能被DML和建索引
首先看官方文档上的解释: Managing External Tables Oracle Database allows you read-only access to data in externa ...
- Oracle使用并行建索引须要注意的问题
建索引时.我们为了建索引快.会加上并行,加上并行之后.此列索引就会是并行了. 訪问有并行度的索引时,CBO可能可能会考虑并行运行.这可能会引发一些问题,如在server资源紧张的时候用并行会引起更加严 ...
- 数据库 基于索引的SQL语句优化之降龙十八掌(转)
一篇挺不错的关于SQL语句优化的文章,因不知原始出处,故未作引用说明! 1 前言 客服业务受到SQL语句的影响非常大,在规模比较大的局点,往往因为一个小的SQL语句不够优化,导致数据库性能急 ...
随机推荐
- Java多线程同步——生产者消费者问题
这是马士兵老师的Java视频教程里的一个生产者消费者问题的模型 public class ProduceConsumer{ public static void main(String[] args) ...
- C++ static_cast dynamic_cast reinterpret_cast const_cast转换
static_cast <type-id> ( expression ) 和C风格的类型转换相似,可以转换一个指针到基类,或者派生类.不做Run-time类型检查,这样转换并不总是安全的. ...
- POJ 1904 King's Quest 强连通分量+二分图增广判定
http://www.cnblogs.com/zxndgv/archive/2011/08/06/2129333.html 这位神说的很好 #include <iostream> #inc ...
- CRC(Cyclic Redundancy Check)循环冗余校验码与海明码的计算题
(17)采用CRC进行差错校验,生成多项式为G(X)=X4+X+1,信息码字为10111,则计算出的CRC校验码是 (17) .A.0000 B.0100 C.0010 D.1100试题 ...
- Tomcat 7 Connector 精读(1)
这个类图是本人截取的最重要的类的方法和属性. 其中ProtocalHandler是协议处理器,tomcat支持的协议以下方法可以看到.不同协议实现了不同的ProtocalHandler类. publi ...
- V&View更新
这几天一直在做V&View的更新工作,这次的更新是质的变化,表面界面变化不大,可是内部确有着翻天覆地的改变. 这几天我主要做了一下几件事: 1. 重新构思了vview的文章发布形式,之前使用k ...
- WAMP下 搭建Zend Framework(Hello World)实例
一.环境搭建 1.下载安装Zend Framework,此步骤不再详细叙述 2.配置php.ini文件 打开php.ini文件,可以找到如下的代码: ; Windows: "\path1;\ ...
- Java 多线程同步的五种方法
一.引言 闲话不多说,进入正题. 二.为什么要线程同步 因为当我们有多个线程要同时访问一个变量或对象时,如果这些线程中既有读又有写操作时,就会导致变量值或对象的状态出现混乱,从而导致程序异常.举个例子 ...
- homework-05 服务器与客户端
首先非常抱歉第三次和第四次作业我没交上来,不想找借口强调原因,但是这两次作业我一定会补上,到时候会@助教.谢谢 回到这次作业! 这次作业邹老师没说博客的格式,所以在这里就没有什么回答问题的东西了.这次 ...
- tomcat 7 用户设置
在tomcat/conf/tomcat-users.xml加入如下脚本就可以了 <role rolename="admin-gui"/> <role rolena ...