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

hints的push_pred应用

 
阅读更多

前俩年在项目中优化了一条SQL,当时从40多秒减少到了2秒,感觉很有成就感,现在反过头来又看了一次,觉得仍然有优化的余地,SQL如下

 

SELECT DISTINCT A.CURTITLE AS CTITLE,
                A.DMODIFYDATE,
                A.NDOCID AS NDOCID,
                A.NPROCID AS NPROCID,
                B.CPROCNAME AS CPROCNAME,
                B.NDAYS AS TRUE_DAYS,
                (SYSDATE - A.DMODIFYDATE) AS DAYSLEFT,
                A.NDOCSORTID AS NDOCSORTID,
                A.NPROCSTATUS AS NPROCSTATUS,
                C.CNAME AS DOCSORTNAME,
                NVL(D.NJJCD, 0) NJJCD,
                D.CDOCFROM AS CDOCFROM,
                D.CDOCPRIORITY AS CDOCPRIORITY,
                D.CWENHAO,
                A.NFWQBOPT,
                D.DW
  FROM WF_DOC_GW A,
       WF_PROCNAME B,
       WF_DOCSORT C,      
       (SELECT   NVL(CFWZH, '') AS CWENHAO,
                NVL(CFWDW, ' ') AS DW,
                NDOCID,
                NJJCD,
                NVL(CDOCFROM, ' ') AS CDOCFROM,
                NVL(CDOCPRIORITY, 0) AS CDOCPRIORITY
           FROM WF_DOC_GW_SHOUWEN SW
         UNION ALL
         SELECT NVL(CWENHAO, ' ') AS CWENHAO,
                NVL(CFWDW, '') AS DW,
                NDOCID,
                NJJCD,
                NVL(CDOCFROM, '本单位发文') AS CDOCFROM,
                NVL(CDOCPRIORITY, 0) AS CDOCPRIORITY
           FROM WF_DOC_GW_FAWEN FW) D
 WHERE A.NPROCID = B.NPROCID AND
       A.NDOCID = D.NDOCID AND
       A.NDOCSORTID = C.NDOCSORTID AND
       C.NDOCSORTID IN (1, 2) AND
       (A.NSTATE = 0 OR (A.NSTATE = 2 AND A.NDOCSORTID = 1)) AND
       ((((INSTR(',' || A.CPROCUSERLIST || ',',
                 ',' || 31601 || ',') > 0 ) OR
       (((27301 = A.RCV_ORGID OR
       27301 = A.RCV_ENTITYID) OR
       (27301 = A.TEMPORGID OR
       27301 = A.TEMPORGID)) AND 20 = A.RCV_ROLEID))) OR
       A.NPROCUID = 31601) AND      
       (A.NMSGID = 0 OR (A.NMSGID IS NOT NULL AND A.NFWQBOPT = 10)) AND
       (A.CURTITLE IS NOT NULL) AND
       ((B.NPROCID = 20 AND A.NPROCSTATUS = 1) OR (B.NPROCID <> 20))
 ORDER BY A.DMODIFYDATE DESC;
 

 

从业务上看,这条SQL最终的结果集只有几条记录,而WF_DOC_GW_SHOUWEN和WF_DOC_GW_FAWEN表的数据量都比较多,有上千万条,而这两张表只是为了取字段的内容,没有过滤任何数据,于是想到,应该把谓词推入到视图中,这样就能用到索引,避免了全表扫描

 

SELECT /*+ push_pred(d)*/  DISTINCT A.CURTITLE AS CTITLE,
                A.DMODIFYDATE,
                A.NDOCID AS NDOCID,
                A.NPROCID AS NPROCID,
                B.CPROCNAME AS CPROCNAME,
                B.NDAYS AS TRUE_DAYS,
                (SYSDATE - A.DMODIFYDATE) AS DAYSLEFT,
                A.NDOCSORTID AS NDOCSORTID,
                A.NPROCSTATUS AS NPROCSTATUS,
                C.CNAME AS DOCSORTNAME,
                NVL(D.NJJCD, 0) NJJCD,
                D.CDOCFROM AS CDOCFROM,
                D.CDOCPRIORITY AS CDOCPRIORITY,
                D.CWENHAO,
                A.NFWQBOPT,
                D.DW
  FROM WF_DOC_GW A,
       WF_PROCNAME B,
       WF_DOCSORT C,      
       (SELECT   NVL(CFWZH, '') AS CWENHAO,
                NVL(CFWDW, ' ') AS DW,
                NDOCID,
                NJJCD,
                NVL(CDOCFROM, ' ') AS CDOCFROM,
                NVL(CDOCPRIORITY, 0) AS CDOCPRIORITY
           FROM WF_DOC_GW_SHOUWEN SW
         UNION ALL
         SELECT NVL(CWENHAO, ' ') AS CWENHAO,
                NVL(CFWDW, '') AS DW,
                NDOCID,
                NJJCD,
                NVL(CDOCFROM, '本单位发文') AS CDOCFROM,
                NVL(CDOCPRIORITY, 0) AS CDOCPRIORITY
           FROM WF_DOC_GW_FAWEN FW) D
 WHERE A.NPROCID = B.NPROCID AND
       A.NDOCID = D.NDOCID AND
       A.NDOCSORTID = C.NDOCSORTID AND
       C.NDOCSORTID IN (1, 2) AND
       (A.NSTATE = 0 OR (A.NSTATE = 2 AND A.NDOCSORTID = 1)) AND
       ((((INSTR(',' || A.CPROCUSERLIST || ',',
                 ',' || 31601 || ',') > 0 ) OR
       (((27301 = A.RCV_ORGID OR
       27301 = A.RCV_ENTITYID) OR
       (27301 = A.TEMPORGID OR
       27301 = A.TEMPORGID)) AND 20 = A.RCV_ROLEID))) OR
       A.NPROCUID = 31601) AND      
       (A.NMSGID = 0 OR (A.NMSGID IS NOT NULL AND A.NFWQBOPT = 10)) AND
       (A.CURTITLE IS NOT NULL) AND
       ((B.NPROCID = 20 AND A.NPROCSTATUS = 1) OR (B.NPROCID <> 20))
 ORDER BY A.DMODIFYDATE DESC

  

只是加了一个hints /*+ push_pred(d)*/,时间从2秒降到了46毫秒,逻辑读也降了一半,执行计划太长,这里就不贴了,本着精益求精的态度,最后应该把中间过程的nvl函数也去掉

分享到:
评论

相关推荐

    template_hints_demo.zip_DEMO

    "template_hints_demo.zip_DEMO" 是一个示例项目,旨在展示如何有效地利用模板功能。这个压缩包包含了一些关于模板使用的提示和实践案例,以帮助开发者更好地理解和应用模板。 1. **模板基础** - 模板分为函数模板...

    AH1014_v1_4_Application_Hints_TJA1042_43_48_51

    ### 高速CAN收发器TJA1042/43/48/51应用提示 #### 1. 产品概述 - **TJA1042/TJA1043/TJA1048/TJA1051**:这些产品是恩智浦半导体(NXP Semiconductors)推出的下一代独立高速CAN(Controller Area Network)收发器。 ...

    oracle-hints.rar_oracle

    Oracle数据库是世界上最广泛使用的数据库管理系统之一,尤其在企业级应用中占据重要地位。"Oracle Hints"是Oracle数据库系统中的一个重要特性,它允许SQL查询优化器根据开发人员提供的指导(即Hints)来选择执行计划...

    oracle hints详细介绍

    #### 二、Hints 的应用场景 1. **性能诊断**:当发现某个查询执行缓慢时,可以通过添加Hints来改变执行计划,以此来定位问题所在。 2. **性能调优**:当数据库优化器未能选择出最优的执行计划时,Hints可以被用来...

    关于oracle的sql优化资料

    - **PUSH_JOIN_PRED(v)** 和 **NO_PUSH_JOIN_PRED(v)**: 控制JOIN谓词是否推入视图。 ##### 5. 读取方式 - **FULL(tab)**: 对表执行全表扫描。 - **CACHE(tab)**: 如果表大小小于`CACHE_SIZE_THRESHOLD`参数设置的...

    Hints优化.pdf

    Oracle Hints是Oracle数据库中一种用于优化SQL查询的工具。它们允许数据库管理员和开发人员提供关于如何执行SQL语句的提示,以此来改善查询性能。Oracle Hints在处理复杂SQL语句或特定类型的数据库操作时尤其有用,...

    Oracle的hints调整机制介绍

    Oracle的Hints调整机制是数据库管理员和开发人员用来指导Oracle Cost-Based Optimizer(CBO)做出更符合预期...因此,在实际应用中,应结合统计信息、性能测试和理解查询语句的上下文来谨慎使用这些optimizer hints。

    hints_website

    【标题】"hints_website"是一个基于ASP.NET技术构建的项目,可能是一个教程、示例代码库或者是一个实际网站的源代码。ASP.NET是微软开发的一个用于构建Web应用程序的框架,它提供了一整套工具和服务,使得开发者能够...

    oracle HINTS用法

    ### Oracle Hints用法详解 Oracle Hints是Oracle数据库中一种非常实用的功能,它允许用户在SQL语句中提供优化器提示,以便更好地控制查询执行计划。这些提示可以帮助数据库优化器选择更有效的路径来执行查询,从而...

    解析Oracle Hints.

    ### 解析Oracle Hints #### 摘要 在现代软件开发过程中,数据库优化成为确保应用程序性能...然而,在实际应用中需要注意,过度使用Hints可能会限制优化器的选择空间,因此建议在充分理解Hints机制的基础上谨慎使用。

    oracle_hints

    **Sql优化之Hints的应用**: 1. **强制索引使用**:当优化器未选择最优索引时,可以使用`USE_INDEX`或`INDEX` hint。例如,如果`employees`表有`emp_id`和`dept_id`两个索引,但优化器选择了全表扫描,你可以加入...

    Oracle 常用 hints 说明

    hints 使用的好的話很好用。在进行sql执行过程中,由于有时候系统自动优化的方式并不是最优的。需要我们手工添加hint来提高查询效率。

    Extended Window Manager Hints

    ### Extended Window Manager Hints (EWMH) 版本 1.4 草案2 #### 引言 Extended Window Manager Hints (EWMH) 规范是一系列为 X Window System 定义的标准协议扩展。这些扩展旨在增强窗口管理器的功能性和互操作性...

    AN00093_TJA1020_APP_Hints.pdf

    ### TJA1020 LIN Transceiver 应用笔记知识点详解 #### 一、概述 TJA1020 是一款适用于汽车及工业领域的低功耗 LIN(Local Interconnect Network)收发器。该器件支持单线总线信号表示方式,并符合 LIN 协议规范中...

    101 Helpful Hints for IELTS

    ### IELTS备考指南:《101 Helpful Hints for IELTS》解析 #### 一、概述 《101 Helpful Hints for IELTS》是一本专门为准备雅思(IELTS)考试的学生编写的实用指导书籍。该书由Garry Adams与Terry Peck共同撰写,...

    Android权限表

    在Android系统中,权限管理是安全模型的核心组成...88. **SET_WALLPAPER_HINTS**:应用可以设置壁纸大小提示。 89. **SHOWfloating_WINDOW**:应用可以显示浮动窗口,如气泡通知。 90. **SUBSCRIBED_FEEDS_READ**:

    vue-dom-hints:Vue devtool,用于在DOM中标识Vue组件及其SFC路径

    :rocket: 安装npm i vue-dom-hints :vertical_traffic_light: 设置将其作为安装到Vue: import DomHints from 'vue-dom-hints'Vue . use ( DomHints ) 在构建中将其禁用以进行生产: if ( process . env . NODE_ENV...

    maven-hints-3.1.4-sources.jar

    maven-hints-3.1.4-sources.jar

    Oracle SQL Hints

    上述仅为部分内容中的部分HINT类型的简要说明,实际上在Oracle数据库中存在着更多复杂的HINT,每个HINT都有其特定的应用场景和作用。使用HINT时需要充分理解其含义和可能产生的影响,避免产生负面效果。在实践中,...

Global site tag (gtag.js) - Google Analytics