利用分区优化SQL

一个哥们QQ问我,这个SQL怎么优化,它要跑160秒 
SQL> explain plan for  select a.so_region_code so_region_code,2                 a.so_county_code so_county_code,3                 a.so_org_id so_org_id,4                 d.org_type_id org_type_id,5                 a.op_id op_id,6                 nvl(c.brand, 0) brand,7                 e.res_code,8                 a.busi_code,9                 a.so_nbr,10                 decode(a.isnormal,11                        2,12                        -count(distinct a.so_nbr),13                        0,14                        count(distinct a.so_nbr),15                        0) so_amount,16                 sum(decode(b.book_item_id, 23000002, item_total, 0)) / 100 sim_fee,17                 sum(decode(b.book_item_id, 23000001, item_total, 0)) / 100 sim_fee_add,18                 sum(decode(b.book_item_id, 27000003, item_total, 0)) / 100 sim_fee_discount,19                 sum(decode(b.book_item_id, 21000013, 0, b.item_total)) / 100 total_fee20            from zk.cm_busi_201108        a,21                 zk.cm_busi_charge_201108 b,22                 zk.cm_user               c,23                 xg.sys_organizations     d,24                 zy.res_sim               e25           where a.so_nbr = b.so_nbr(+)26             and a.serv_id = c.serv_id27             and c.sim_id = e.sim_id28             and a.so_org_id = d.org_id29             and (b.book_item_id in (23000001, 23000002, 27000003) or30                 a.busi_code in (1,31                                  2,32                                  4,33                                  5,34                                  8,35                                  11,36                                  14,37                                  15,38                                  17,39                                  18,40                                  19,41                                  21,42                                  24,43                                  25,44                                  28,45                                  99,46                                  101,47                                  104,48                                  105,49                                  201,50                                  204,51                                  205,52                                  206,53                                  2201,54                                  1023,55                                  1006,56                                  3312,57                                  2251))58             and a.op_id != 7101026459             and a.so_date >= to_date('20110831000000', 'yyyymmddhh24miss')60             and a.so_date <= to_date('20110831235959', 'yyyymmddhh24miss')61             and a.so_county_code =711162             and a.so_nbr is not null63           group by a.so_region_code,64                    a.so_county_code,65                    a.so_org_id,66                    d.org_type_id,67                    a.op_id,68                    c.brand,69                    e.res_code,70                    a.busi_code,71                    a.so_nbr,72                    a.isnormal;已解释。已用时间:  00: 00: 00.03
SQL>                   
SQL>                     select * from table(dbms_xplan.display);PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                |  Name                   | Rows  | Bytes | Cost (%CPU)| Pstart| Pstop |
----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                         |                         |    59 | 11741 |  1703   (1)|       |       |
|   1 |  SORT GROUP BY                           |                         |    59 | 11741 |  1703   (1)|       |       |
|*  2 |   FILTER                                 |                         |       |       |            |       |       |
|*  3 |    HASH JOIN OUTER                       |                         |       |       |            |       |       |
|   4 |     TABLE ACCESS BY LOCAL INDEX ROWID    | RES_SIM                 |     1 |    26 |    32   (4)|       |       |
|   5 |      NESTED LOOPS                        |                         |    46 |  7820 |  1670   (1)|       |       |
|   6 |       NESTED LOOPS                       |                         |    49 |  7056 |   146   (2)|       |       |
|   7 |        NESTED LOOPS                      |                         |    46 |  5244 |    53   (2)|       |       |
|*  8 |         TABLE ACCESS BY INDEX ROWID      | CM_BUSI_201108          |    46 |  4784 |     7  (15)|       |       |
|*  9 |          INDEX RANGE SCAN                | DX_BUSI_SO_DATE_201108  |   166K|       |     3  (34)|       |       |
|  10 |         TABLE ACCESS BY INDEX ROWID      | SYS_ORGANIZATIONS       |     1 |    10 |     2  (50)|       |       |
|* 11 |          INDEX UNIQUE SCAN               | PK_SYS_ORGANIZATIONS    |     1 |       |            |       |       |
|  12 |        TABLE ACCESS BY GLOBAL INDEX ROWID| CM_USER                 |     1 |    30 |     3  (34)| ROWID | ROW L |
|* 13 |         INDEX UNIQUE SCAN                | PK_ZK_CM_USER           |     1 |       |     2  (50)|       |       |
|  14 |       PARTITION RANGE ALL                |                         |       |       |            |     1 |    10 |
|* 15 |        INDEX RANGE SCAN                  | IDX_SIM_SIM             |     1 |       |    31   (4)|     1 |    10 |
|  16 |     TABLE ACCESS FULL                    | CM_BUSI_CHARGE_201108   |   474 | 13746 |    32   (4)|       |       |
----------------------------------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------2 - filter("B"."BOOK_ITEM_ID"=23000001 OR "B"."BOOK_ITEM_ID"=23000002 OR "B"."BOOK_ITEM_ID"=27000"A"."BUSI_CODE"=1 OR "A"."BUSI_CODE"=2 OR "A"."BUSI_CODE"=4 OR "A"."BUSI_CODE"=5 OR "A"."BUSI"A"."BUSI_CODE"=11 OR "A"."BUSI_CODE"=14 OR "A"."BUSI_CODE"=15 OR "A"."BUSI_CODE"=17 OR "A".""A"."BUSI_CODE"=19 OR "A"."BUSI_CODE"=21 OR "A"."BUSI_CODE"=24 OR "A"."BUSI_CODE"=25 OR "A".""A"."BUSI_CODE"=99 OR "A"."BUSI_CODE"=101 OR "A"."BUSI_CODE"=104 OR "A"."BUSI_CODE"=105 OR "A"A"."BUSI_CODE"=204 OR "A"."BUSI_CODE"=205 OR "A"."BUSI_CODE"=206 OR "A"."BUSI_CODE"=1006 OR "A"."BUSI_CODE"=2201 OR "A"."BUSI_CODE"=2251 OR "A"."BUSI_CODE"=3312)3 - access("A"."SO_NBR"="B"."SO_NBR"(+))8 - filter("A"."SO_COUNTY_CODE"=7111 AND "A"."OP_ID"<>71010264 AND "A"."SO_NBR" IS NOT NULL)9 - access("A"."SO_DATE">=TO_DATE(' 2011-08-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND "A"."SO_D2011-08-31 23:59:59', 'syyyy-mm-dd hh24:mi:ss'))11 - access("A"."SO_ORG_ID"="D"."ORG_ID")13 - access("A"."SERV_ID"="C"."SERV_ID")15 - access("C"."SIM_ID"="E"."SIM_ID")已选择40行。已用时间:  00: 00: 00.20

CM_BUSI_201108 是大表,有3千多万的数据,CM_USER也是一个大表,有3千多万的数据 其他表都是小表
注意观察第9行,CBO认为它返回166k的数据,回表的时候又过滤有filter过滤,这个时候CBO认为它返回46行,先不管这46行 CBO计算是对是错,单单就是索引扫描返回166k到表

CM_BUSI_201108 去做166k次应该也很耗费时间。所以给出优化建议 对表CM_BUSI_201108进行分区,可以根据SO_DATE做range分区,另外SO_COUNTRY_CODE可以查看值多不多,如果不多可以做 range-list分区

他最终只做了range分区,并且让他创建了一个本地有前缀的组合索引(他最开始创建的是global索引,没有起到优化效果)

create index YI_XXX ON CM_BUSI_201108(SO_DATE,SO_COUNTRY_CODE) LOCAL

执行计划如下:

--------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                               |  Name                     | Rows  | Bytes | Cost (%CPU)| Pstart| Pstop |
--------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                        |                           |    17 |  3264 |   635   (1)|       |       |
|   1 |  TABLE ACCESS BY LOCAL INDEX ROWID      | RES_SIM                   |     1 |    26 |    32   (4)|       |       |
|   2 |   NESTED LOOPS                          |                           |    17 |  3264 |   635   (1)|       |       |
|   3 |    NESTED LOOPS                         |                           |    18 |  2988 |    75   (2)|       |       |
|*  4 |     FILTER                              |                           |       |       |            |       |       |
|   5 |      NESTED LOOPS OUTER                 |                           |       |       |            |       |       |
|   6 |       NESTED LOOPS                      |                           |    17 |  1870 |    24   (5)|       |       |
|*  7 |        TABLE ACCESS BY LOCAL INDEX ROWID| CM_BUSI_201108            |    17 |  1700 |     7  (15)|     6 |     6 |
|*  8 |         INDEX RANGE SCAN                | YI_XXX                    | 61917 |       |     3  (34)|     6 |     6 |
|   9 |        TABLE ACCESS BY INDEX ROWID      | SYS_ORGANIZATIONS         |     1 |    10 |     2  (50)|       |       |
|* 10 |         INDEX UNIQUE SCAN               | PK_SYS_ORGANIZATIONS      |     1 |       |            |       |       |
|* 11 |       INDEX RANGE SCAN                  | PK_CM_BUSI_CHARGE_201108  |     1 |    26 |     2  (50)|       |       |
|  12 |     TABLE ACCESS BY GLOBAL INDEX ROWID  | CM_USER                   |     1 |    30 |     3  (34)| ROWID | ROW L |
|* 13 |      INDEX UNIQUE SCAN                  | PK_ZK_CM_USER             |     1 |       |     2  (50)|       |       |
|  14 |    PARTITION RANGE ALL                  |                           |       |       |            |     1 |    10 |
|* 15 |     INDEX RANGE SCAN                    | IDX_SIM_SIM               |     1 |       |    31   (4)|     1 |    10 |
--------------------------------------------------------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------4 - filter("B"."BOOK_ITEM_ID"=23000001 OR "B"."BOOK_ITEM_ID"=23000002 OR "B"."BOOK_ITEM_ID"=27000003)7 - filter("A"."OP_ID"<>71010264)8 - access("A"."SO_DATE">=TO_DATE(' 2011-08-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND "A"."SO_COUNTY_CODE"=7111 AND "A"."SO_DATE"<=TO_DATE(' 2011-08-31 23:59:59', 'syyyy-mm-dd hh24:mi:ss'))filter("A"."SO_COUNTY_CODE"=7111)10 - access("A"."SO_ORG_ID"="D"."ORG_ID")11 - access("A"."SO_NBR"="B"."SO_NBR"(+))13 - access("A"."SERV_ID"="C"."SERV_ID")15 - access("C"."SIM_ID"="E"."SIM_ID")


分区之后,需要过滤的数据量大大减少,这样嵌套循环执行的次数也大大减少,最终SQL能在4秒左右跑完,其实这个优化方案并不是最优的,由于不能连接到他的数据库,这个SQL的优化就暂时告一段落。分区对SQL的优化还是非常有帮助的。

转载于:https://www.cnblogs.com/hehe520/archive/2011/09/20/6330563.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/410376.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++ class struct同名_相对于C语言,C++对struct做了非常多的扩充,功能更全面了

我有相当长的一段时间(数月)没有更新文章了。并不是我放弃了写技术文章&#xff0c;而是因为这段时间&#xff0c;我把精力主要放在了图像智能算法的学习上了。去年12月时&#xff0c;我对图像智能算法还懵懵懂懂&#xff0c;做着 Linux 嵌入式应用程序开发&#xff0c;现在我已…

Burp破解安装(1.7和2.0)

依赖 由于Brup是使用java语言开发的&#xff0c;因此我们需要本地有jdk8的环境&#xff0c;教程自己百度或者<a href"https://www.runoob.com/java/java-environment-setup.html">https://www.runoob.com/java/java-environment-setup.html</a>&#xff…

[html] 请问60*80的canvas占多少内存?你是怎么计算的?

[html] 请问60*80的canvas占多少内存&#xff1f;你是怎么计算的&#xff1f; 一个像素为1byte&#xff0c;通过getImageData方法可以得到canvas的二进制流个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起…

C# ASP.NET MVC 微信和支付宝H5支付开发及Demo

微信和支付宝H5支付 最近开发任务遇到了一个要在手机浏览器里面调起微信和支付宝去支付的开发需求&#xff0c;以前都是做的扫码支付或者JSAPI都是在软件内部支付的&#xff0c;没遇到过在自己浏览器内唤醒微信或者支付宝的支付这种开发在开发的过程中遇到了许多问题和坑点这里…

dbnetlib sqlserver不存在或拒绝访问_SQL Server数据库损坏和修复

常见错误解读823错误错误信息是&#xff1a;“在文件%ls中、偏移量为%#016I64x的位置执行%S_MSG期间&#xff0c;操作系统已经向SQL Server返回了错误%ls。”“The operating systemreturned error %ls to SQL Server during a %S_MSGat offset %#016I64x in file %ls.”例如&a…

vs2008使用技巧

在做 asp.net 程序时发布站点如果报错&#xff0c;但是之前编译没有问题的话就要查看一下发布时的错误信息。查看信息是在 视图—>输出 。 &#xff08;我自己在实际的开发时遇到过&#xff0c;自己在文件夹里将一个图片删除掉了&#xff0c;所以导致在项目中无法找到这个图…

[html] 精确获取页面元素位置的方式有哪些?

[html] 精确获取页面元素位置的方式有哪些&#xff1f; let btn document.querySelector(#ele) let {top, left} getComputedStyle(btn) console.log(top:, top, left:, left)个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一…

2019.7.29学习整理python

2019.7.29学习整理python 1.变量 1.1什么是变量&#xff1f; 是变化的量。描述变化的世间万物的状态 1.2变量的组成 变量名&#xff1a;变量名用来引用变量值&#xff0c;但凡需要用变量值&#xff0c;都需要通过变量名。赋值符号&#xff1a;赋值变量值&#xff1a;存放数据&a…

C# ASP.NET MVC 阿里云短信验证码Demo

相信大家在开发过程中又很多使用到验证码验证的功能&#xff0c;今天将验证码的验证整理一下写了一个Demo 通过本篇后你能学习到: 阿里云短信服务Drapper连接SQL Server进行增改操作JS前端倒计时 完成后效果如下: (一)首先我们要使用短信我们先注册短信服务所需的内容 1.首先…

mybatis generator生成example_[Springboot系列] SpringBoot与Mybatis结合

本文作者&#xff1a;cuifuanMybatis 是一个持久层ORM框架&#xff0c;负责Java与数据库数据交互&#xff0c;也可以简易理解为中介&#xff0c;相对于它&#xff0c;还有个中介是hibernate,不过在mybatis中sql语句的灵活性&#xff0c;可优化性比较强&#xff0c;这也是现在大…

[html] 页面刷新时sessionStroage会变(会清空)吗?

[html] 页面刷新时sessionStroage会变&#xff08;会清空&#xff09;吗&#xff1f; 不会SessionStroage 是数据页面会话级别的, 当你在打开这个页面的时候会被创建, 并且重新加载或恢复页面仍会保持原来的页面会话...当你在关闭对应浏览器Tab的时候会被清出个人简介 我是歌…

sql 数据库 实例删除

前言&#xff1a;一直纠结于我的数据库sql2005实例2种登陆模式都登不上&#xff0c;今天决定把它删掉重新安装了下&#xff0c;操作步骤是我百度来的&#xff0c;这里做下记录&#xff0c;也能给一些遇到相同情况的朋友方便 SQL Server的安装和卸载是每个SQL Server用户都应该掌…

在laravel5.8中集成swoole组件----用协程实现的服务端和客户端(二)---静态文件如何部署...

目前&#xff0c;较为成熟的技术是采用laravelS组件&#xff0c;注意和laravel 区别laravelS多了一个大写的S&#xff0c;由于laravelS默认监听5200端口&#xff0c;所以laravel项目要做一些调整 例如&#xff1a; 静态文件引入的方式-----从静态资源服务器加载我们熟悉的js和c…

Linux上Oracle 11g安装步骤图解(超详细图文教程)附带导入数据和新建数据库教程

首先本文采用Docker方式快速在Linux上安装 目录 1.安装Docker容器 (1)登陆服务器&#xff0c;输入命令安装Docker容器 (2)安装完成后运行下列代码如果弹出Docker版本则表示安装成功 (3)启动Docker并设置跟随系统开机启动 (4)由于国内系统拉取国外镜像缓慢所以我们在开始安…

python中import sys_python import sys出错怎么办

当在pycharm中输入如下代码时&#xff1a;import sys 一、问题&#xff1a; sys下出现红色波浪线&#xff0c;按CtrlF1显示的信息为&#xff1a;no module named sys。 二、原因&#xff1a; 在装Python解释器时&#xff0c;我为了图方便装的是 Python 3.7.0a4 的embeddable版本…

[html] canvas透明度是0.6的矩形和透明度是0.2的矩形叠加到一起,透明度是多少

[html] canvas透明度是0.6的矩形和透明度是0.2的矩形叠加到一起&#xff0c;透明度是多少 首先是透明度值的计算。颜色在本质上是光的产物&#xff0c;假设把透明度理解为玻璃的透光性&#xff0c;则一切就变得很easy。比如一个 alpha 0.2 的颜色&#xff0c;就能够将其想像为…

Windows phone7 软件发布:理财计算器(包括wp7房贷计算器,wp7个税计算器,wp7存款利息计算器)...

前一段时间&#xff0c;需要经常用到贷款计算器的功能&#xff0c;这样有利于我们做出更好的决策。但是我们只能通过银行的工作人员的计算器来计算&#xff0c;给我带来了极大的不便和损失&#xff0c;由此便萌生了开发一个Windows phone7版的贷款计算器的功能。 此计算器目前的…

大地SEO教程学习笔记之八:

仔细分析一下pagerank的构建&#xff1a; 全局结构&#xff1a;&#xff08;1&#xff09;局部结构&#xff08;2&#xff09;web结构&#xff08;矩阵&#xff09;。 细化结构&#xff1a;&#xff08;1&#xff09;分类结构&#xff08;矩阵&#xff09;&#xff0…

[html] 请实现一个文章阅读的进度条

[html] 请实现一个文章阅读的进度条 chrome 浏览器中&#xff0c;通过document.documentElement.scrollTop获取页面滚过高度&#xff0c;通过document.documentElement.scrollHeight获取页面总高度&#xff0c;通过document.documentElement.clientHeight获取当前内容高度。通…

eclipse debug怎么用_利用maven/eclipse搭建ssm(spring+spring mvc+mybatis)

maven搭建安装过程挺简单的&#xff0c;去apache下载apache-maven的zip包&#xff0c;解压到一个目录下&#xff0c;如下图接下来配置windows环境&#xff0c;右击我的电脑--》属性--》高级系统设置--》环境变量--》系统变量--》新建&#xff0c;如下图就是你解压的maven的home…