oracle 都是parallel惹的祸【1-2分钟出结果变1-2秒】

原文:http://blog.csdn.net/shushugood/article/details/9000628

--------------------------------------------------------

该项目是中国联通xxxx话务系统,我的架构设计+需求设计,+运维保障+数据库开发,全套服务。

在今天开发完毕后,突然有个模块的需求,用户号码为必须选择,感觉有点郁闷,因为1小时有1000w数据,把所有用户号码显示出来,是不是有点画蛇添足呢。

我的开始设想是查询详单,像中移营业厅,需要输入号码,或者省份证查询模糊查询,没有谓词不能查询。(感觉设计合情合理)


1.但是想了解整个系统用户分布情况,必须输入条件,是不是有点不可用。

2.并且没有谓词过滤,查询会慢,非常慢(1-2分钟出结果),目标是3-5秒内出数据。

                                              注:优化难点是把2秒变成1秒,  反之,把2小时变成2分钟非常简单。

第1步:

下面看看语句和执行计划:

[sql] view plain copy
  1. SQL>  explain plan for  SELECT /*+ parallel(8)   */  
  2.   2   starttime starttime,  
  3.   3   cv.groupid,  
  4.   4   cs.custmangerid,  
  5.   5   callercarrier callercarrier,  
  6.   6   callernum callernum,  
  7.   7   calledcarrier calledcarrier,  
  8.   8   callednum callednum,  
  9.   9   calleenum calleenum,  
  10.  10   round(duration / 60, 2) CallTimeLen,  
  11.  11   count(*) over(ORDER BY NULL ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) "@totalrows"  
  12.  12    FROM CS_xxxx dt, cfg_vipphones cv, cfg_vipusers cs  
  13.  13   WHERE dt.StartTime >= '2013-05-31 13:00:00'  
  14.  14     and dt.StartTime < '2013-05-31 14:00:00'  
  15.  15     AND dt.Callercarrier = 2  
  16.  16     AND dt.callernum >= cv.beginphone  
  17.  17     and dt.callernum <= cv.endphone  
  18.  18     and cv.groupid = cs.groupid;  
  19.    
  20. Explained  
  21.    
  22. SQL> select * from table(dbms_xplan.display);  
  23.    
  24. PLAN_TABLE_OUTPUT  
  25. --------------------------------------------------------------------------------  
  26. Plan hash value: 2172492340  
  27. --------------------------------------------------------------------------------  
  28. | Id  | Operation                              | Name            | Rows  | Bytes  
  29. --------------------------------------------------------------------------------  
  30. |   0 | SELECT STATEMENT                       |                 |   478K|    34  
  31. |*  1 |  PX COORDINATOR                        |                 |       |  
  32. |   2 |   PX SEND QC (RANDOM)                  | :TQ10001        |   478K|    34  
  33. |   3 |    WINDOW BUFFER                       |                 |   478K|    34  
  34. |*  4 |     FILTER                             |                 |       |  
  35. |   5 |      MERGE JOIN                        |                 |   478K|    34  
  36. |   6 |       SORT JOIN                        |                 |    11 |   363  
  37. |   7 |        BUFFER SORT                     |                 |       |  
  38. |   8 |         PX RECEIVE                     |                 |       |  
  39. |   9 |          PX SEND BROADCAST             | :TQ10000        |       |  
  40. |  10 |           NESTED LOOPS                 |                 |       |  
  41. |  11 |            NESTED LOOPS                |                 |    11 |   363  
  42. |  12 |             TABLE ACCESS BY INDEX ROWID| CFG_VIPUSERS    |     3 |    18  
  43. |  13 |              INDEX FULL SCAN           | PK_CFG_VIPUSERS |     3 |  
  44. |* 14 |             INDEX RANGE SCAN           | VIPUSERS_FK     |     4 |  
  45.    
  46. PLAN_TABLE_OUTPUT  
  47. --------------------------------------------------------------------------------  
  48. |  15 |            TABLE ACCESS BY INDEX ROWID | CFG_VIPPHONES   |     4 |   108  
  49. |* 16 |       FILTER                           |                 |       |  
  50. |* 17 |        SORT JOIN                       |                 |   516K|    21  
  51. |  18 |         PX BLOCK ITERATOR              |                 |   516K|    21  
  52. |* 19 |          TABLE ACCESS FULL             | CS_xxxx          |   516K|    21  
  53. --------------------------------------------------------------------------------  
  54. Predicate Information (identified by operation id):  
  55. ---------------------------------------------------  
  56.    1 - filter(TO_DATE('2013-05-31 13:00:00')<TO_DATE('2013-05-31 14:00:00'))  
  57.    4 - filter(TO_DATE('2013-05-31 13:00:00')<TO_DATE('2013-05-31 14:00:00'))  
  58.   14 - access("CV"."GROUPID"="CS"."GROUPID")  
  59.   16 - filter("DT"."CALLERNUM"<="CV"."ENDPHONE")  
  60.   17 - access("DT"."CALLERNUM">="CV"."BEGINPHONE")  
  61.        filter("DT"."CALLERNUM">="CV"."BEGINPHONE")  
  62.   19 - filter("DT"."CALLERCARRIER"=2 AND "DT"."STARTTIME">='2013-05-31 13:00:00'  
  63. Note  
  64. -----  
  65.    - Degree of Parallelism is 8 because of hint  
  66.    
  67. 41 rows selected  
  68.    
  69. SQL>   
大家看出问题了吗,说实话,执行计划只是一个参考,看看index是否生效,是不是全表scan,nloop,hash,是不是可以增加use_nl, 等hint

OLAP和OLTP 又有很大区别了,包含数据库参数设定,sql写法,hint是否启用等


第2步:

我怀疑是3张表关联,谓词出了问题。

注意看filter,看看是否是分区表搞的鬼。 查看后一切正常,因为是我写的,我最清楚。哈哈。。。

在多表关联时,如果有视图,可以考虑视图的合并,关联的优先选择,再hash。 都试过了,不行。


第3 步:

怀疑是并行出错了,看看表的并且度,索引并行,

或者我不要并行试试。果然,8-10秒出结果

[sql] view plain copy
  1. SQL>  explain plan for  SELECT  
  2.   2   starttime starttime,  
  3.   3   cv.groupid,  
  4.   4   cs.custmangerid,  
  5.   5   callercarrier callercarrier,  
  6.   6   callernum callernum,  
  7.   7   calledcarrier calledcarrier,  
  8.   8   callednum callednum,  
  9.   9   calleenum calleenum,  
  10.  10   round(duration / 60, 2) CallTimeLen,  
  11.  11   count(*) over(ORDER BY NULL ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) "@totalrows"  
  12.  12    FROM CS——xx dt, cxg_vippxxx cv, cxg_vipxxx cs  
  13.  13   WHERE dt.StartTime >= '2013-05-31 13:00:00'  
  14.  14     and dt.StartTime < '2013-05-31 14:00:00'  
  15.  15     AND dt.Callercarrier = 2  
  16.  16     AND dt.callernum >= cv.beginphone  
  17.  17     and dt.callernum <= cv.endphone  
  18.  18     and cv.groupid = cs.groupid;  
  19.    
  20. Explained  
  21.    
  22. SQL> select * from table(dbms_xplan.display);  
  23.    
  24. PLAN_TABLE_OUTPUT  
  25. --------------------------------------------------------------------------------  
  26. Plan hash value: 1705527799  
  27. --------------------------------------------------------------------------------  
  28. | Id  | Operation                         | Name            | Rows  | Bytes |Tem  
  29. --------------------------------------------------------------------------------  
  30. |   0 | SELECT STATEMENT                  |                 |   478K|    34M|  
  31. |   1 |  WINDOW BUFFER                    |                 |   478K|    34M|  
  32. |*  2 |   FILTER                          |                 |       |       |  
  33. |   3 |    MERGE JOIN                     |                 |   478K|    34M|  
  34. |   4 |     SORT JOIN                     |                 |    11 |   363 |  
  35. |   5 |      NESTED LOOPS                 |                 |       |       |  
  36. |   6 |       NESTED LOOPS                |                 |    11 |   363 |  
  37. |   7 |        TABLE ACCESS BY INDEX ROWID| CFGxxUSERS    |     3 |    18 |  
  38. |   8 |         INDEX FULL SCAN           | PK_CFG_VIPUSERS |     3 |       |  
  39. |*  9 |        INDEX RANGE SCAN           | VIPUSERS_FK     |     4 |       |  
  40. |  10 |       TABLE ACCESS BY INDEX ROWID | CFG_xxNES   |     4 |   108 |  
  41. |* 11 |     FILTER                        |                 |       |       |  
  42. |* 12 |      SORT JOIN                    |                 |   516K|    21M|  
  43. |  13 |       PARTITION RANGE ITERATOR    |                 |   516K|    21M|  
  44. |* 14 |        TABLE ACCESS FULL          | CS_xxx         |   516K|    21M|  
  45.    
  46. PLAN_TABLE_OUTPUT  
  47. --------------------------------------------------------------------------------  
  48. --------------------------------------------------------------------------------  
  49. Predicate Information (identified by operation id):  
  50. ---------------------------------------------------  
  51.    2 - filter(TO_DATE('2013-05-31 13:00:00')<TO_DATE('2013-05-31 14:00:00'))  
  52.    9 - access("CV"."GROUPID"="CS"."GROUPID")  
  53.   11 - filter("DT"."CALLERNUM"<="CV"."ENDPHONE")  
  54.   12 - access("DT"."CALLERNUM">="CV"."BEGINPHONE")  
  55.        filter("DT"."CALLERNUM">="CV"."BEGINPHONE")  
  56.   14 - filter("DT"."CALLERCARRIER"=2 AND "DT"."STARTTIME">='2013-05-31 13:00:00'  
  57.               14:00:00')  
  58.    
  59. 32 rows selected  
  60.    
  61. SQL>   

第4步:

看看并行设置,这个也有很大关系,因为并行的模块太多,造成排队拥塞的情况

<1>如果有并行度低于系统最大并行数的查询在跑,那接下来的并行查询会怎么跑呢?
When you specify parallel degree 4 oracle tries to allocate 4 producer slaves and 4 consumer slaves. The producers can feed any of the consumers. 
If there are only 2 slaves available then we use these. 
If there is only 1 slave available then we go serial 
If there are none available then we use serial. 
If parallel_min_percent is set then we error ora 12827 instead of using a lower number of slaves or going serial


<2>设定parallel_max_servers 多大为好?
在多CPU的环境中,一般把CPU-1或CPU的数量做个最大并行数,因为并行查询运行时还需要一个进程协调各并行进程.对于单CPU没什么好说的.


<3>并行查询能提高系统的性能吗?
并行查询运行时,很容易会使机器运行在高负荷下,令系统对其它事务的处理时间大大加长.并行查询一般适合在非业务高峰值人工执行,并不适合在程序中指定运行并行查询.
PINNER:
并行不等于快速,仅仅是适合在数据仓库环境,低业务请求与低并发操作的时候
典型的OLTP系统,如果我们的系统,是绝对不允许并行查询出现的。 

(引荐哈)


第5步:

问题解决,注意看看问题,paralle的写法,当一个表时,用parallel(8) , 表示当前表并行8个进程

 当有多个表是,请指定某一个表,否则会默认3个表,当然执行计划上看不出来,可以trace一把 看看

[sql] view plain copy
  1. SQL>  explain plan for  SELECT /*+ parallel(dt,8)   */  
  2.   2   starttime starttime,  
  3.   3   cv.groupid,  
  4.   4   cs.custmangerid,  
  5.   5   callercarrier callercarrier,  
  6.   6   callernum callernum,  
  7.   7   calledcarrier calledcarrier,  
  8.   8   callednum callednum,  
  9.   9   calleenum calleenum,  
  10.  10   round(duration / 60, 2) CallTimeLen,  
  11.  11   count(*) over(ORDER BY NULL ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) "@totalrows"  
  12.  12    FROM CS_CDR dt, cfg_vipphones cv, cfg_vipusers cs  
  13.  13   WHERE dt.StartTime >= '2013-05-31 13:00:00'  
  14.  14     and dt.StartTime < '2013-05-31 14:00:00'  
  15.  15     AND dt.Callercarrier = 2  
  16.  16     AND dt.callernum >= cv.beginphone  
  17.  17     and dt.callernum <= cv.endphone  
  18.  18     and cv.groupid = cs.groupid;  
  19.    
  20. Explained  
  21.    
  22. SQL> select * from table(dbms_xplan.display);  
  23.    
  24. PLAN_TABLE_OUTPUT  
  25. --------------------------------------------------------------------------------  
  26. Plan hash value: 2172492340  
  27. --------------------------------------------------------------------------------  
  28. | Id  | Operation                              | Name            | Rows  | Bytes  
  29. --------------------------------------------------------------------------------  
  30. |   0 | SELECT STATEMENT                       |                 |   478K|    34  
  31. |*  1 |  PX COORDINATOR                        |                 |       |  
  32. |   2 |   PX SEND QC (RANDOM)                  | :TQ10001        |   478K|    34  
  33. |   3 |    WINDOW BUFFER                       |                 |   478K|    34  
  34. |*  4 |     FILTER                             |                 |       |  
  35. |   5 |      MERGE JOIN                        |                 |   478K|    34  
  36. |   6 |       SORT JOIN                        |                 |    11 |   363  
  37. |   7 |        BUFFER SORT                     |                 |       |  
  38. |   8 |         PX RECEIVE                     |                 |       |  
  39. |   9 |          PX SEND BROADCAST             | :TQ10000        |       |  
  40. |  10 |           NESTED LOOPS                 |                 |       |  
  41. |  11 |            NESTED LOOPS                |                 |    11 |   363  
  42. |  12 |             TABLE ACCESS BY INDEX ROWID| CFG_VIPUSERS    |     3 |    18  
  43. |  13 |              INDEX FULL SCAN           | PK_CFG_VIPUSERS |     3 |  
  44. |* 14 |             INDEX RANGE SCAN           | VIPUSERS_FK     |     4 |  
  45.    
  46. PLAN_TABLE_OUTPUT  
  47. --------------------------------------------------------------------------------  
  48. |  15 |            TABLE ACCESS BY INDEX ROWID | CFG_VIPPHONES   |     4 |   108  
  49. |* 16 |       FILTER                           |                 |       |  
  50. |* 17 |        SORT JOIN                       |                 |   516K|    21  
  51. |  18 |         PX BLOCK ITERATOR              |                 |   516K|    21  
  52. |* 19 |          TABLE ACCESS FULL             | CS_xxxx         |   516K|    21  
  53. --------------------------------------------------------------------------------  
  54. Predicate Information (identified by operation id):  
  55. ---------------------------------------------------  
  56.    1 - filter(TO_DATE('2013-05-31 13:00:00')<TO_DATE('2013-05-31 14:00:00'))  
  57.    4 - filter(TO_DATE('2013-05-31 13:00:00')<TO_DATE('2013-05-31 14:00:00'))  
  58.   14 - access("CV"."GROUPID"="CS"."GROUPID")  
  59.   16 - filter("DT"."CALLERNUM"<="CV"."ENDPHONE")  
  60.   17 - access("DT"."CALLERNUM">="CV"."BEGINPHONE")  
  61.        filter("DT"."CALLERNUM">="CV"."BEGINPHONE")  
  62.   19 - filter("DT"."CALLERCARRIER"=2 AND "DT"."STARTTIME">='2013-05-31 13:00:00'  
  63.    
  64. 37 rows selected  
  65.    
  66. SQL>   


目前是3秒出结果,已经达到预期,当然谓词为1小时,或者有号码过滤绝对是1秒内响应速度。


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

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

相关文章

二叉搜索树(BST树)的简单实现

#include <stdlib.h>template<typename T>class CBinSTree;template <typename T>class CTreeNode{//树节点类public:CTreeNode(const T& item,CTreeNode<T>* lptr NULL,CTreeNode<T>* rptr NULL):data(item),left(lptr),right(rptr){}CTr…

Oracle 创建 DBLink 的方法

原文出处&#xff1a;http://blog.csdn.net/davidhsing/article/details/6408770 ------------------- 1、如果需要创建全局 DBLink&#xff0c;则需要先确定用户有创建 dblink 的权限&#xff1a; [c-sharp] view plaincopy print?select * from user_sys_privs where privi…

eclipse init 配置

--设置最大的堆和最小堆大小.两者一样表示固定大小.这样可以防止老年代内存扩展造成额外的gc.当然也会多占一些内存.系统内存不足的慎用 -Xms512m -Xmx512m --加大年轻代内存.减少minor gc -Xmn164m --这个是永久代大小.默认是64M,增加到96M.固定大小,减少扩展造成的gc -XX:Per…

Oracle对表空间操作的sql

管理员给用户增加不限制表空间权限 grant unlimited tablespace to 用户; 查看表空间使用情况 SELECT a.tablespace_name "表空间名", total "表空间大小", free "表空间剩余大小", (total - free) "表空间使用大小", total / (…

IPKISS Tutorials------线路仿真

IPKISS------线路仿真 推荐阅读引言正文示例1------PDK中集成好的器件示例2------使用 i3.Circuit 框架示例3------i3.PCell 框架推荐阅读 Matplotlib ------ 纵坐标科学计数法含义 引言 我们知道,想要在 IPKISS 中进行仿真,首先需要对线路进行定义,但是我们知道,在 IPK…

Oracle Database 11g Express Edition使用限制,与其他版本的区别

Oracle Database 11g Express Edition是 Oracle 数据库的免费版本&#xff0c;支持标准版的大部分功能&#xff0c;11g Express Edition 提供 Windows 和 Linux 版本。 做为免费的 Oracle 数据库版本&#xff0c;Express Edition的限制是&#xff1a; 1&#xff09;最大数据库大…

c++ 复制构造函数_C++学习刷题8--复制构造函数和赋值运算符重载函数

一、前言本部分为C语言刷题系列中的第8节&#xff0c;主要讲解这几个知识点&#xff1a;复制构造函数和赋值运算符重载函数。欢迎大家提出意见、指出错误或提供更好的题目&#xff01;二、知识点讲解知识点1&#xff1a;复制构造函数1、当依据一个已存对象创建一个新对象时&…

ORACLE使用WITH AS和HINT MATERIALIZE优化SQL解决FILTER效率低下

原文&#xff1a;http://blog.csdn.net/liangweiwei130/article/details/37882503 ------------------------------------------------- 在做项目的过程中&#xff0c;一个页面使用类似如下的SQL查询数据&#xff0c;为了保密和使用方便&#xff0c;我把项目中有关的表名和字段…

面试题333

2019独角兽企业重金招聘Python工程师标准>>> 面试题333 博客分类&#xff1a; java 1、spring的缓存,mybatis缓存2、介绍下dubbo。A服务调用B服务&#xff0c;B服务又调用C服务,这种情况怎么办3、JVM监控工具有哪些&#xff0c;区别又是什么&#xff08;如能追上各个…

mysql vfp_用 VFP 连接 MYSQL 数据库

今天试了一下用 Visual FoxPro 连接 MySQL 数据库。首先在自己机子上架设 MySQL 数据库&#xff0c;就不多说了&#xff0c;我是直接用 XAMPP 架设的服务器。然后在 VFP 里输入命令&#xff1a;sqlhandle SQLSTRINGCONNECT("driver{MySQL ODBC 5.1 Driver};server127.0.0…

oracle中with的用法及用处

原文出处&#xff1a;http://blog.csdn.net/chenjinlin1/article/details/6572401 ---------------------------------------------------------------- WITH 用于一个语句中某些中间结果放在临时表空间的SQL语句 如 WITH channel_summary AS ( SELECT channels.channel_de…

xpath选择当前结点的子节点

2019独角兽企业重金招聘Python工程师标准>>> xpath选择当前结点的子节点 博客分类&#xff1a; 搜索引擎&#xff0c;爬虫 在通过selenium使用xpath选择节点的时候&#xff0c;可能会遇到这么一种情况&#xff1a;在指定的当前节点下搜索满足要求的节点。 node dri…

mysql中主从复制配置文件_MySQL主从复制 配置文件实例

1、主服务器配置文件# For advice on how to change settings please see# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html[mysqld]# Remove leading # and set to the amount of RAM for the most important data# cache in MySQL. Start at 70%…

SQL中,where 与 having 的性能比较

原文&#xff1a;http://blog.csdn.net/showshore/article/details/7263115 --------------------------------------------------------- 在做项目的过程中&#xff0c;使用sql语句时&#xff0c;很多时候会用到where或having。 看到国外一个论坛上有人提到两者性能比较的这个…

Spark 独立部署模式

2019独角兽企业重金招聘Python工程师标准>>> Spark 独立部署模式 博客分类&#xff1a; spark 除了在 Mesos 或 YARN 集群上运行之外, Spark 还提供一个简单的独立部署的模块。你通过手动开始master和workers 来启动一个独立的集群。你也可以利用我们提供的脚本 .…

mysql数据库的链接地址_常用数据库连接URL地址大全

1、Oracle8/8i/9i数据库(thin模式) Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url="jdbc:oracle:thin:@localhost:1521:orcl"; //orcl为数据库的SID String user="test"; String password="test"; Con…

数据库中where与having区别~~~

1、where和having的执行级别不同 在查询过程中聚合语句(sum,min,max,avg,count)要比having子句优先执行.而where子句在查询过程中执行优先级别优先于聚合语句(sum,min,max,avg,count)。 having就是来弥补where在分组数据判断时的不足。因为where执行优先级别要快于聚合语句。…

spring boot 1.5.4 定时任务和异步调用(十)

1 Spring Boot定时任务和异步调用 我们在编写Spring Boot应用中经常会遇到这样的场景&#xff0c;比如&#xff1a;我需要定时地发送一些短信、邮件之类的操作&#xff0c;也可能会定时地检查和监控一些标志、参数等。 spring boot定时任务spring-boot-jsp项目源码&#…

ORA-04063: view DAILY.TMP_TBX_100_0_S4 有错误

执行&#xff1a; CREATE TABLE TMP_TBX_100_0_S3 AS SELECT t.* FROM (select t1.*,NULL AS sdate, NULL AS report_id from TMP_TBX_100_0_S4_1 t1 union all select t2.* from TMP_TBX_100_0_S4_2 t2) t 报错&#xff1a; ORA-00955: name is already used by an exis…

MySQL左连接还有过滤条件_MySQL左连接问题,右表做筛选,左表列依然在?

问 题原料两张表&#xff0c;一张user表&#xff0c;一张user_log表(这个例子举的不好)CREATE TABLE user (id int(11) NOT NULL AUTO_INCREMENT,name varchar(20) DEFAULT NULL,PRIMARY KEY (id)) ENGINEInnoDB DEFAULT CHARSETutf8;CREATE TABLE user_log (id int(10) NOT NU…