`
yufeng0471
  • 浏览: 98593 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

使用push_subq优化SQL

 
阅读更多

需要优化的SQL

SELECT *
  FROM (SELECT A.*, ROWNUM R
          FROM (SELECT DISTINCT A.NDOCID AS NDOCID,
                                TO_CHAR(NVL(A.DMODIFYDATE, A.DCREATEDATE),
                                        'yyyy-MM-dd hh24:mi:ss') AS DMODIFYDATE,
                                NVL(A.CURTITLE, ' ') AS CTITLE,
                                A.DMODIFYDATE AS DM,
                                A.DCREATEDATE,
                                A.CURTITLE,
                                A.NPROCID,
                                A.NPROCSTATUS,
                                A.NDOCSORTID,
                                A.NMANAGERID,
                                GW.CDOCPRIORITY,
                                GW.CFWDW,
                                GW.WENHAO,
                                GW.CDOCUTYPE,
                                COUNT(A.NDOCID) OVER() AS ROWNUMBER
                  FROM WF_DOC_GW A,
                       (SELECT NDOCID,
                               NJJCD,
                               CBT AS CTITLE,
                               CFWDW,
                               NVL(CDOCFROM, '本单位发文') AS CDOCFROM,
                               NVL(CDOCPRIORITY, 100) AS CDOCPRIORITY,
                               NVL(CFWZH, '无文号') AS WENHAO,
                               CDOCUTYPE,
                               CFWYDW
                          FROM WF_DOC_GW_SHOUWEN SW
                        UNION ALL
                        SELECT NDOCID,
                               NJJCD,
                               CBT AS CTITLE,
                               CFWDW,
                               NVL(CDOCFROM, '本单位发文') AS CDOCFROM,
                               NVL(CDOCPRIORITY, 0) AS CDOCPRIORITY,
                               NVL(CWENHAO, '无文号') AS WENHAO,
                               CDOCUTYPE,
                               CFWYDW
                          FROM WF_DOC_GW_FAWEN FW) GW
                 WHERE ((A.NPROCID = 20 AND A.NPROCSTATUS = 1) OR
                       (A.NPROCID <> 20))
                   AND (A.NSTATE = 0 OR (A.NSTATE = 2 AND A.NDOCSORTID = 1))
                   AND A.NDOCSORTID IN (1, 2)
                   AND ((INSTR(',' || A.CPROCUSERLIST || ',',
                               ',' || '4301' || ',') > 0 AND
                       A.NDOCID NOT IN
                       (SELECT GI.SRC_NDOCID
                            FROM WF_DOC_GW_INNER GI
                           WHERE GI.SRC_USERID = 4301
                             AND GI.RETURNSTATUS IS NULL
                             AND GI.SRC_NDOCID IS NOT NULL)) OR
                       A.NPROCUID = 4301)
                   AND (A.NMSGID = 0 OR
                       (A.NMSGID IS NOT NULL AND A.NFWQBOPT = 10))
                   AND GW.NDOCID = A.NDOCID
                 ORDER BY A.DMODIFYDATE DESC, GW.CDOCPRIORITY DESC) A
         WHERE ROWNUM <= 13) B
 WHERE R > 0

 执行计划

 

-------------------------------------------------------------------------
| Id  | Operation                         | Name               | E-Rows |
-------------------------------------------------------------------------
|   0 | SELECT STATEMENT                  |                    |        |
|*  1 |  VIEW                             |                    |     13 |
|*  2 |   COUNT STOPKEY                   |                    |        |
|   3 |    VIEW                           |                    |    261 |
|*  4 |     SORT UNIQUE STOPKEY           |                    |    261 |
|   5 |      WINDOW BUFFER                |                    |    261 |
|*  6 |       FILTER                      |                    |        |
|*  7 |        HASH JOIN                  |                    |  90557 |
|*  8 |         TABLE ACCESS FULL         | WF_DOC_GW          |  84010 |
|   9 |         VIEW                      |                    |    261K|
|  10 |          UNION-ALL                |                    |        |
|  11 |           TABLE ACCESS FULL       | WF_DOC_GW_SHOUWEN  |    242K|
|  12 |           TABLE ACCESS FULL       | WF_DOC_GW_FAWEN    |  18876 |
|* 13 |        TABLE ACCESS BY INDEX ROWID| WF_DOC_GW_INNER    |      1 |
|* 14 |         INDEX RANGE SCAN          | IDX_INNER_SRCDOCID |      2 |
-------------------------------------------------------------------------

 
 

Predicate Information (identified by operation id):
---------------------------------------------------
 
   1 - filter("R">0)
   2 - filter(ROWNUM<=13)
   4 - filter(ROWNUM<=13)
   6 - filter(((INSTR(','||"A"."CPROCUSERLIST"||',',',4301,')>0 AND  IS NULL) OR "A"."NPROCUID"=4301))
   8 - filter((("A"."NSTATE"=0 OR ("A"."NSTATE"=2 AND "A"."NDOCSORTID"=1)) AND ("A"."NPROCID"<>20 OR 
              ("A"."NPROCSTATUS"=1 AND "A"."NPROCID"=20)) AND ("A"."NMSGID"=0 OR ("A"."NFWQBOPT"=10 AND "A"."NMSGID" IS NOT 
              NULL)) AND INTERNAL_FUNCTION("A"."NDOCSORTID")))
  12 - access("NDOCID"="A"."NDOCID")
  14 - access("NDOCID"="A"."NDOCID")
  15 - filter(("GI"."SRC_USERID"=4301 AND "GI"."RETURNSTATUS" IS NULL))
  16 - access("GI"."SRC_NDOCID"=:B1)
       filter("GI"."SRC_NDOCID" IS NOT NULL)

 

该条SQL执行后的结果集只有2条数据,WF_DOC_GW_SHOUWEN数据量有24万,NDOCID是主键,从执行计划看,走的是全表扫描,和预期结果不符合,应该走的是唯一索引才对,优化的思路是先关联WF_DOC_GW和WF_DOC_GW_INNER,计算出结果集后,再关联WF_DOC_GW_SHOUWEN,这样就会走唯一索引,使用push_subq可以达到想要到想过,修改后的SQL如下

SELECT *
  FROM (SELECT A.*, ROWNUM R
          FROM (SELECT /*+ push_subq(@tmp)*/
                DISTINCT A.NDOCID AS NDOCID,
                         TO_CHAR(NVL(A.DMODIFYDATE, A.DCREATEDATE),
                                 'yyyy-MM-dd hh24:mi:ss') AS DMODIFYDATE,
                         NVL(A.CURTITLE, ' ') AS CTITLE,
                         A.DMODIFYDATE AS DM,
                         A.DCREATEDATE,
                         A.CURTITLE,
                         A.NPROCID,
                         A.NPROCSTATUS,
                         A.NDOCSORTID,
                         A.NMANAGERID,
                         GW.CDOCPRIORITY,
                         GW.CFWDW,
                         GW.WENHAO,
                         GW.CDOCUTYPE,
                         COUNT(A.NDOCID) OVER() AS ROWNUMBER
                  FROM WF_DOC_GW A,
                       (SELECT NDOCID,
                               NJJCD,
                               CBT AS CTITLE,
                               CFWDW,
                               NVL(CDOCFROM, '本单位发文') AS CDOCFROM,
                               NVL(CDOCPRIORITY, 100) AS CDOCPRIORITY,
                               NVL(CFWZH, '无文号') AS WENHAO,
                               CDOCUTYPE,
                               CFWYDW
                          FROM WF_DOC_GW_SHOUWEN SW
                        UNION ALL
                        SELECT NDOCID,
                               NJJCD,
                               CBT AS CTITLE,
                               CFWDW,
                               NVL(CDOCFROM, '本单位发文') AS CDOCFROM,
                               NVL(CDOCPRIORITY, 0) AS CDOCPRIORITY,
                               NVL(CWENHAO, '无文号') AS WENHAO,
                               CDOCUTYPE,
                               CFWYDW
                          FROM WF_DOC_GW_FAWEN FW) GW
                 WHERE ((A.NPROCID = 20 AND A.NPROCSTATUS = 1) OR
                       (A.NPROCID <> 20))
                   AND (A.NSTATE = 0 OR (A.NSTATE = 2 AND A.NDOCSORTID = 1))
                   AND A.NDOCSORTID IN (1, 2)
                   AND ((INSTR(',' || A.CPROCUSERLIST || ',',
                               ',' || '4301' || ',') > 0 AND
                       A.NDOCID NOT IN
                       (SELECT /*+ qb_name(tmp)*/
                           GI.SRC_NDOCID
                            FROM WF_DOC_GW_INNER GI
                           WHERE GI.SRC_USERID = 4301
                             AND GI.RETURNSTATUS IS NULL
                             AND GI.SRC_NDOCID IS NOT NULL)) OR
                       A.NPROCUID = 4301)
                   AND (A.NMSGID = 0 OR
                       (A.NMSGID IS NOT NULL AND A.NFWQBOPT = 10))
                   AND GW.NDOCID = A.NDOCID
                 ORDER BY A.DMODIFYDATE DESC, GW.CDOCPRIORITY DESC) A
         WHERE ROWNUM <= 13) B
 WHERE R > 0

   

------------------------------------------------------------------------------------------------------------
| Id  | Operation                           | Name                 | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |                      |    13 |  9984 |  2518   (1)| 00:00:31 |
|*  1 |  VIEW                               |                      |    13 |  9984 |  2518   (1)| 00:00:31 |
|*  2 |   COUNT STOPKEY                     |                      |       |       |            |          |
|   3 |    VIEW                             |                      |   244 |   179K|  2518   (1)| 00:00:31 |
|*  4 |     SORT UNIQUE STOPKEY             |                      |   244 | 63928 |  2517   (1)| 00:00:31 |
|   5 |      WINDOW BUFFER                  |                      |   244 | 63928 |  2518   (1)| 00:00:31 |
|   6 |       NESTED LOOPS                  |                      |   244 | 63928 |  2516   (1)| 00:00:31 |
|*  7 |        TABLE ACCESS FULL            | WF_DOC_GW            |   242 | 27588 |  1547   (2)| 00:00:19 |
|*  8 |         TABLE ACCESS BY INDEX ROWID | WF_DOC_GW_INNER      |     1 |    17 |     2   (0)| 00:00:01 |
|*  9 |          INDEX RANGE SCAN           | IDX_INNER_SRCDOCID   |     2 |       |     1   (0)| 00:00:01 |
|  10 |        VIEW                         |                      |     1 |   148 |     4   (0)| 00:00:01 |
|  11 |         UNION ALL PUSHED PREDICATE  |                      |       |       |            |          |
|  12 |          TABLE ACCESS BY INDEX ROWID| WF_DOC_GW_SHOUWEN    |     1 |    49 |     2   (0)| 00:00:01 |
|* 13 |           INDEX UNIQUE SCAN         | PK_WF_DOC_GW_SHOUWEN |     1 |       |     1   (0)| 00:00:01 |
|  14 |          TABLE ACCESS BY INDEX ROWID| WF_DOC_GW_FAWEN      |     1 |    38 |     2   (0)| 00:00:01 |
|* 15 |           INDEX UNIQUE SCAN         | PK_WF_DOC_GW_FAWEN   |     1 |       |     1   (0)| 00:00:01 |

 

优化前的逻辑读是12000,优化后的逻辑读降到了5000,还是蛮有效果的

  • 大小: 102.4 KB
分享到:
评论

相关推荐

    opnet 点对点例子

    opnet 点对点例子描述了源节点无限发送包到目的节点

    Subq3-Text:基于Solarized和Soda的SublimeText配置

    它为SublimeText使用了和。 ## Installation以下内容会将此存储库的文件克隆到~/Library/Application Support/Sublime Text 2/Packages/User 。 因此,您无需先安装Solarized和Soda。 $ git clone ...

    python源码基于YOLOV5安全帽检测系统及危险区域入侵检测告警系统源码.rar

    本资源提供了一个基于YOLOv5的安全帽检测系统及危险区域入侵检测告警系统的Python源码 该系统主要利用深度学习和计算机视觉技术,实现了安全帽和危险区域入侵的实时检测与告警。具体功能如下: 1. 安全帽检测:系统能够识别并检测工人是否佩戴安全帽,对于未佩戴安全帽的工人,系统会发出告警信号,提醒工人佩戴安全帽。 2. 危险区域入侵检测:系统能够实时监测危险区域,如高空作业、机械设备等,对于未经授权的人员或车辆进入危险区域,系统会立即发出告警信号,阻止入侵行为,确保安全。 本资源采用了YOLOv5作为目标检测算法,该算法基于深度学习和卷积神经网络,具有较高的检测精度和实时性能。同时,本资源还提供了详细的使用说明和示例代码,便于用户快速上手和实现二次开发。 运行测试ok,课程设计高分资源,放心下载使用!该资源适合计算机相关专业(如人工智能、通信工程、自动化、软件工程等)的在校学生、老师或者企业员工下载,适合小白学习或者实际项目借鉴参考! 当然也可作为毕业设计、课程设计、课程作业、项目初期立项演示等。如果基础还行,可以在此代码基础之上做改动以实现更多功能,如增加多种安全帽和危险区域的识别、支持多种传感器数据输入、实现远程监控等。

    基于SpringBoot的响应式技术博客的设计和实现(源码+文档)

    本课题将许多当前比较热门的技术框架有机的集合起来,比如Spring boot、Spring data、Elasticsearch等。同时采用Java8作为主要开发语言,利用新型API,改善传统的开发模式和代码结构,实现了具有实时全文搜索、博客编辑、分布式文件存贮和能够在浏览器中适配移动端等功能的响应式技术博客。 本毕业设计选用SpringBoot框架,结合Thymeleaf,SpringData,SpringSecurity,Elasticsearch等技术,旨在为技术人员设计并实现一款用于记录并分享技术文档的技术博客。通过该技术博客,方便技术人员记录自己工作和学习过程中的点滴,不断地进行技术的总结和积累,从而提升自己的综合能力,并通过博客这一平台,把自己的知识、经验、教训分享给大家,为志同道合者提供一个相互交流、共同学习的平台,促使更多的人共同进步[9]。学习到别人的一些良好的设计思路、编码风格和优秀的技术能力,使笔者的设计初衷。本系统主要面向web端的用户,希望能给用户更多的学习和交流的选择。

    javalab 3.zip

    javalab 3.zip

    J0001基于javaWeb的健身房管理系统设计与实现

    该系统基于javaweb整合,数据层为MyBatis,mysql数据库,具有完整的业务逻辑,适合选题:健身、健身房、健身房管理等 健身房管理系统开发使用JSP技术和MySQL数据库,该系统所使用的是Java语言,Java是目前最为优秀的面相对象的程序设计语言,只需要开发者对概念有一些了解就可以编写出程序,因此,开发该系统总体上不会有很大的难度,同时在开发系统时,所使用的数据库也是必不可少的。开发此系统所使用的技术都是通过在大学期间学习的,对每科课程都有很好的掌握,对系统的开发具有很好的判断性。因此,在完成该系统的开发建设时所使用的技术是完全可行的。 学员主要实现的功能有:网站信息、课程信息、教练列表、我的信息、登录 员工主要实现的功能有:工资查询、会员管理、器材借还、健身卡管理、个人中心、登录 教练主要实现的功能有:工资查询、学员列表、个人中心 管理员是系统的核心,可以对系统信息进行更新和维护,主要实现的功能有:个人中心、学员管理、教练管理、网站信息管理、器械信息管理、课程信息管理。

    架构.cpp

    架构.cpp

    利用Python实现中文文本关键词抽取(三种方法)

    文本关键词抽取,是对文本信息进行高度凝练的一种有效手段,通过3-5个词语准确概括文本的主题,帮助读者快速理解文本信息。目前,用于文本关键词提取的主要方法有四种:基于TF-IDF的关键词抽取、基于TextRank的关键词抽取、基于Word2Vec词聚类的关键词抽取,以及多种算法相融合的关键词抽取。笔者在使用前三种算法进行关键词抽取的学习过程中,发现采用TF-IDF和TextRank方法进行关键词抽取在网上有很多的例子,代码和步骤也比较简单,但是采用Word2Vec词聚类方法时网上的资料并未把过程和步骤表达的很清晰。因此,本文分别采用 1. TF-IDF方法 2. TextRank方 3. Word2Vec词聚类方法 实现对专利文本(同样适用于其它类型文本)的关键词抽取,通过理论与实践相结合的方式,一步步了解、学习、实现中文文本关键词抽取。

    演示Asm字节码插桩asmd-demo-master.zip

    演示Asm字节码插桩asmd-demo-master.zip

    VB+access干部档案管理系统(源代码+系统).zip

    档案是国家机构、社会组织在干部管理活动中形成的、记述和反映个人经历和德才表现等情况、以人头为单位集中保存以备查考的原始记录。 档案管理的目的是为了档案的利用。如果放松管理,无论对单位和对个人都会影响档案的利用。举个例子,如果应该进入档案的材料没及时归档,则对个人资料的记载就是不完整的,缺乏了这一部分的凭证,就无法出具相关证明。如果发生了损坏或丢失档案的情况,后果就更加严重,有的档案材料是难以重新建立的。档案的管理是与干部、流动手续的衔接密切相关的。以北京市人才服务中心为例,拥有着全市最大的档案管理中心,共保管了档案12万份。这些档案的利用率相对很高,表现在出具干部证明、婚育证明、出国政审、职称评定、工龄认定以及各种保险的相关手续等方面。档案中心的工作人员每天都要接待大量的企业用人中的查询、查阅。 档案好像是计划经济的产物,在市场经济条件下,随着人才流动潮流的涌现,人们思想观念上的放开,档案越来越被人们所冷落和忽视。到底档案对个人以及人力资源部意味着什么,放松对档案的管理会带来哪些后果呢? 目前我国的档案管理社会化趋势日益明显。非公有制单位,国有企业事业单位发展干部代理使流动人员档案管理

    本算法是结合“时间遗忘曲线”和“物品类….zip

    协同过滤算法(Collaborative Filtering)是一种经典的推荐算法,其基本原理是“协同大家的反馈、评价和意见,一起对海量的信息进行过滤,从中筛选出用户可能感兴趣的信息”。它主要依赖于用户和物品之间的行为关系进行推荐。 协同过滤算法主要分为两类: 基于物品的协同过滤算法:给用户推荐与他之前喜欢的物品相似的物品。 基于用户的协同过滤算法:给用户推荐与他兴趣相似的用户喜欢的物品。 协同过滤算法的优点包括: 无需事先对商品或用户进行分类或标注,适用于各种类型的数据。 算法简单易懂,容易实现和部署。 推荐结果准确性较高,能够为用户提供个性化的推荐服务。 然而,协同过滤算法也存在一些缺点: 对数据量和数据质量要求较高,需要大量的历史数据和较高的数据质量。 容易受到“冷启动”问题的影响,即对新用户或新商品的推荐效果较差。 存在“同质化”问题,即推荐结果容易出现重复或相似的情况。 协同过滤算法在多个场景中有广泛的应用,如电商推荐系统、社交网络推荐和视频推荐系统等。在这些场景中,协同过滤算法可以根据用户的历史行为数据,推荐与用户兴趣相似的商品、用户或内容,从而提高用户的购买转化率、活跃度和社交体验。 未来,协同过滤算法的发展方向可能是结合其他推荐算法形成混合推荐系统,以充分发挥各算法的优势。

    JAVAWEB校园二手平台项目.zip

    JAVAWEB校园二手平台项目,基本功能包括:个人信息、商品管理;交易商品板块管理等。本系统结构如下: (1)本月推荐交易板块: 电脑及配件:实现对该类商品的查询、用户留言功能 通讯器材:实现对该类商品的查询、用户留言功能 视听设备:实现对该类商品的查询、用户留言功能 书籍报刊:实现对该类商品的查询、用户留言功能 生活服务:实现对该类商品的查询、用户留言功能 房屋信息:实现对该类商品的查询、用户留言功能 交通工具:实现对该类商品的查询、用户留言功能 其他商品:实现对该类商品的查询、用户留言功能 (2)载入个人用户: 用户登陆 用户注册 (3)个人平台: 信息管理:实现对商品的删除、修改、查询功能 添加二手信息:实现对新商品的添加 修改个人资料:实现对用户个人信息的修改 注销

    文档+程序动态四足机器人的自由模型预测控制

    Representation-Free Model Predictive Control for Dynamic Quadruped 专注于动态四足机器人的控制问题,特别强调了自由模型预测控制(Free-MPC)在该领域的应用。内容涉及自由MPC的原理、算法构建和在四足机器人动态平衡与运动控制中的实践案例。通过案例分析,揭示了自由MPC如何提升四足机器人在复杂地形下的适应性和稳定性。适合机器人工程师、控制理论研究者和相关专业学生阅读。使用场景包括机器人设计与开发、控制算法研究以及高等教育课程。目标是推动四足机器人控制技术的发展,增强其在多变环境中的表现。 关键词标签: 四足机器人 动态控制 自由模型预测控制 Free-MPC 机器人工程

    Building Android Apps in Python

    Building Android Apps in Python

    基于PHP实现的WEB图片共享系统(源代码+论文)

    基于PHP实现的WEB图片共享系统(源代码+论文)

    soxr-0.3.5-cp37-cp37m-win_amd64.whl.zip

    soxr-0.3.5-cp37-cp37m-win_amd64.whl.zip

    HeartShapeArtist

    这个 HeartShapeArtist 脚本使用 Python 的 turtle 图形库来绘制一个美丽的红色心形。它首先设置画布和画笔的属性,包括速度、颜色和背景,然后通过连续的小步骤绘制心形的上半部分和尖端,完成后进行颜色填充。该脚本适合用作学习如何使用 turtle 模块进行基本图形绘制的入门示例,也可以作为情人节或其他特殊场合的小项目。只需运行脚本,即可在屏幕上看到一个完美的心形图案展现出来。

    MySQL文件,省市区sql数据,微调

    参考了https://github.com/nhjclxc/District-SQL; 调整了北京优先级,删除了level = 4的数据;

    基于vhdl硬件描述语言设计数字时钟交通灯LCD12864液晶显二进制转BCD码等示quartus工程实验例程代码合集(22个)

    基于vhdl硬件描述语言设计数字时钟交通灯LCD12864液晶显二进制转BCD码等示quartus工程实验例程代码合集(22个): 12864液晶显示 1602lcd液晶显示 7段数码管 i2c总线 KEYSCAN MCU PS2 UART VGA 拨码开关 蜂鸣器 跑马灯 8位优先编码器 乘法器 二进制转BCD码 交通灯 减法器 加法器 四位比较器 多路选择器 数字时钟 简单状态机

    java作业管理系统设计(源代码+LW).zip

    java作业管理系统设计(源代码+LW)

Global site tag (gtag.js) - Google Analytics