近期监控数据库,发现以下语句跑得很慢,原来运行计划走了导致笛卡尔积,来看以下语句:

  1. SQL> explain plan for
  2. 2 SELECT COUNT(*)
  3. 3 FROM "GD_FS"."TZZ_SJ_DEV_DISC_79073" "A2",
  4. 4 "GD_FS"."TZZ_SJ_DEVELOP_MONTH" "A1"
  5. 5 WHERE "A1"."SERV_ID" = "A2"."SERV_ID"
  6. 6 AND "A1"."STAT_DATE" = "A2"."STAT_DATE"
  7. 7 AND "A2"."ALLO_DISC_TYPE_3" LIKE '%租机%'
  8. 8 OR "A2"."ALLO_DISC_TYPE_3" LIKE '%零预存%';
  9.  
  10. Explained.
  11.  
  12. SQL> @getplan
  13. 'general,outline,starts'
  14.  
  15. Enter value for plan type:
  16.  
  17. PLAN_TABLE_OUTPUT
  18. ---------------------------------------------------------------------------------------------------------------------
  19.  
  20. Plan hash value: 1410945947
  21.  
  22. ------------------------------------------------------------------------------------------------
  23. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
  24. ------------------------------------------------------------------------------------------------
  25. | 0 | SELECT STATEMENT | | 1 | 42 | 271M (2)|999:59:59 |
  26. | 1 | SORT AGGREGATE | | 1 | 42 | | |
  27. | 2 | CONCATENATION | | | | | |
  28. | 3 | MERGE JOIN CARTESIAN| | 82G| 3239G| 271M (2)|999:59:59 |
  29. |* 4 | TABLE ACCESS FULL | TZZ_SJ_DEV_DISC_79073 | 22606 | 640K| 743 (2)| 00:00:11 |
  30. | 5 | BUFFER SORT | | 3663K| 45M| 271M (2)|999:59:59 |
  31. | 6 | TABLE ACCESS FULL | TZZ_SJ_DEVELOP_MONTH | 3663K| 45M| 11994 (2)| 00:02:48 |
  32. |* 7 | HASH JOIN | | 1 | 42 | 12762 (2)| 00:02:59 |
  33. |* 8 | TABLE ACCESS FULL | TZZ_SJ_DEV_DISC_79073 | 21476 | 608K| 743 (2)| 00:00:11 |
  34. | 9 | TABLE ACCESS FULL | TZZ_SJ_DEVELOP_MONTH | 3663K| 45M| 11996 (2)| 00:02:48 |
  35. ------------------------------------------------------------------------------------------------
  36.  
  37. Predicate Information (identified by operation id):
  38. ---------------------------------------------------
  39.  
  40. 4 - filter("A2"."ALLO_DISC_TYPE_3" LIKE '%零预存%')
  41. 7 - access("A1"."SERV_ID"="A2"."SERV_ID" AND "A1"."STAT_DATE"="A2"."STAT_DATE")
  42. 8 - filter("A2"."ALLO_DISC_TYPE_3" LIKE '%租机%' AND LNNVL("A2"."ALLO_DISC_TYPE_3"
  43. LIKE '%零预存%'))

--表大小的情况:

  1. OWNER SEGMENT_NAME SEGMENT_TYPE Size(Mb)
  2. -------------------- ------------------------------ -------------------- ----------
  3. GD_FS TZZ_SJ_DEV_DISC_79073 TABLE 43
  4. GD_FS TZZ_SJ_DEVELOP_MONTH TABLE 577.375

两个表并不大,一个43M,一个577M,这里肯定是开发者不小心,写错了语句,导致跑不出来。

AND "A2"."ALLO_DISC_TYPE_3" LIKE '%租机%'  OR "A2"."ALLO_DISC_TYPE_3" LIKE '%零预存%';改成

AND ("A2"."ALLO_DISC_TYPE_3" LIKE '%租机%'  OR "A2"."ALLO_DISC_TYPE_3" LIKE '%零预存%');

改动语句后,问题解决。

改写后:

  1. SQL> explain plan for
  2. 2 SELECT COUNT(*)
  3. 3 FROM "GD_FS"."TZZ_SJ_DEV_DISC_79073" "A2",
  4. 4 "GD_FS"."TZZ_SJ_DEVELOP_MONTH" "A1"
  5. 5 WHERE "A1"."SERV_ID" = "A2"."SERV_ID"
  6. 6 AND "A1"."STAT_DATE" = "A2"."STAT_DATE"
  7. 7 AND ("A2"."ALLO_DISC_TYPE_3" LIKE '%租机%' OR "A2"."ALLO_DISC_TYPE_3" LIKE '%零预存%');
  8.  
  9. Explained.
  10.  
  11. SQL> @getplan
  12. 'general,outline,starts'
  13.  
  14. Enter value for plan type:
  15.  
  16. PLAN_TABLE_OUTPUT
  17. --------------------------------------------------------------------------------------------------------
  18.  
  19. Plan hash value: 3104770780
  20.  
  21. ---------------------------------------------------------------------------------------------
  22. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
  23. ---------------------------------------------------------------------------------------------
  24. | 0 | SELECT STATEMENT | | 1 | 42 | 12765 (2)| 00:02:59 |
  25. | 1 | SORT AGGREGATE | | 1 | 42 | | |
  26. |* 2 | HASH JOIN | | 44081 | 1808K| 12765 (2)| 00:02:59 |
  27. |* 3 | TABLE ACCESS FULL| TZZ_SJ_DEV_DISC_79073 | 44081 | 1248K| 745 (3)| 00:00:11 |
  28. | 4 | TABLE ACCESS FULL| TZZ_SJ_DEVELOP_MONTH | 3663K| 45M| 11996 (2)| 00:02:48 |
  29. ---------------------------------------------------------------------------------------------
  30.  
  31. Predicate Information (identified by operation id):
  32. ---------------------------------------------------
  33.  
  34. 2 - access("A1"."SERV_ID"="A2"."SERV_ID" AND "A1"."STAT_DATE"="A2"."STAT_DATE")
  35. 3 - filter("A2"."ALLO_DISC_TYPE_3" LIKE '%租机%' OR "A2"."ALLO_DISC_TYPE_3" LIKE
  36. '%零预存%')

OR导致笛卡尔积的更多相关文章

  1. SQL笛卡尔积查询与关联查询性能对比

    首先声明一下,sql会用略懂,不是专家,以下内容均为工作经验,聊以抒情. 今天帮忙验证同事发布的端口时,查看了一下相关sql内容,发现其使用的sql语句会导致笛卡尔积现象,为了帮其讲解进行了如下分析: ...

  2. Nested Loops join时显示no join predicate原因分析以及解决办法

    本文出处:http://www.cnblogs.com/wy123/p/6238844.html 最近遇到一个存储过程在某些特殊的情况下,效率极其低效, 至于底下到什么程度我现在都没有一个确切的数据, ...

  3. mysql知识点(三)

    1.表关联是可以利用两个表的索引的,如果是用子查询,至少第二次查询是没有办法使用索引的. 2.  为了给主查询提供数据而首先执行的查询被叫做子查询 3.如果WHERE子句的查询条件里使用了函数(WHE ...

  4. 转 移动云基于MySQL Galera的PXC运维实战

    ##sample 1 : mysql 监控 1.phpadmin  比较简单,适合上手 2.mysql_web python 写的, https://github.com/ycg/mysql_web/ ...

  5. efcore分表下"完美"实现

    ShardingCore 如何呈现"完美"分表 这篇文章是我针对efcore的分表的简单介绍,如果您有以下需求那么可以自己选择是否使用本框架,本框架将一直持续更新下去,并且免费开源 ...

  6. mysql,SQL标准,多表查询中内连接,外连接,自然连接等详解之查询结果集的笛卡尔积的演化

    先附上数据. CREATE TABLE `course` ( `cno` ) NOT NULL, `cname` ) CHARACTER SET utf8 NOT NULL, `ctime` ) NO ...

  7. 数据库之SQL笛卡尔积

    1.笛卡尔积定义 笛卡尔积在SQL中的实现方式既是交叉连接(Cross Join).所有连接方式都会先生成临时笛卡尔积表,笛卡尔积是关系代数里的一个概念,表示两个表中的每一行数据任意组合,上图中两个表 ...

  8. PyODPS DataFrame 处理笛卡尔积的几种方式

    PyODPS 提供了 DataFrame API 来用类似 pandas 的接口进行大规模数据分析以及预处理,本文主要介绍如何使用 PyODPS 执行笛卡尔积的操作. 笛卡尔积最常出现的场景是两两之间 ...

  9. hive中笛卡尔积的优化

    由于一个业务,必须要进行笛卡尔积,但是速度太慢了,left join时左表大概4万条数据,右表大概 3000多条数据,这样大概就是一亿多条数据, 这在大数据领域其实不算很大的数据量,但是hive中跑的 ...

随机推荐

  1. 【转】Robot Framework 快速入门

    目录 介绍 概述 安装 运行demo 介绍样例应用程序 测试用例 第一个测试用例 高级别测试用例 数据驱动测试用例 关键词keywords 内置关键词 库关键词 用户定义关键词 变量 定义变量 使用变 ...

  2. C++中的class (2)

    class Father { protected void methodA(){ //do something } private void methodB(){//do something } } ...

  3. HDU2647(拓扑排序+反向建图)

    题意不说了,说下思路. 给出的关系是a要求的工资要比b的工资多,因为尽可能的让老板少付钱,那么a的工资就是b的工资+1.能够确定关系为a>b,依据拓扑排序建边的原则是把"小于" ...

  4. poj 2689 巧妙地运用素数筛选

    称号: 给出一个区间[L,R]求在该区间内的素数最短,最长距离. (R < 2 * 10^9 , R - L <= 10 ^ 6) 由数论知识可得一个数的因子可在开根号内得到. 所以,我们 ...

  5. NSIS:使用WinVer.nsh头文件判断操作系统版本

    原文 NSIS:使用WinVer.nsh头文件判断操作系统版本 AtLeastWin<version> 检测是否高于指定版本 IsWin<version> 检测指定版本(唯一限 ...

  6. 标准SVD和改进的SVD

    参考链接:http://www.cnblogs.com/yangxiao99/p/4752890.html 参考链接:http://www.cnblogs.com/yangxiao99/p/47529 ...

  7. Advanced Installer 9.8打包实录

    原文 Advanced Installer 9.8打包实录 主要介绍:(1)创建工程,(2)创建快捷方式及其图标(3)卸载设置 创建工程(.net为例): 工程创建完成....接下来进行简单设置 开始 ...

  8. 批处理删除IIS的everyone、users的访问权限

    原文 批处理删除IIS的everyone.users的访问权限 以下批处理代码功能,实现的是,删除C盘的everyone.users用户对IIS的权限. 一.删除C盘的everyone的权限 cd/  ...

  9. 【甘道夫】官方网站MapReduce代码注释具体实例

    引言 1.本文不描写叙述MapReduce入门知识,这类知识网上非常多.请自行查阅 2.本文的实例代码来自官网 http://hadoop.apache.org/docs/current/hadoop ...

  10. QtQuick桌面应用程序开发指导 3)达到UI而功能_B 4)动态管理Note物_A

    3.2 把Page Item和Marker Item绑定 之前我们实现了PagePanel组件, 使用了三个state来切换Page组件的opacity属性; 这一步我们会使用Marker和Marke ...