前俩年在项目中优化了一条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函数也去掉
相关推荐
AH1014_v1_4_Application_Hints_TJA1042_43_48_51
Six hints for using templates
oracle hints的详细介绍,包括各种优化算法等。
sql error can be handled
Hints优化.pdf
hints_website
Oracle的hints调整机制介绍 Oracle的hints调整机制介绍 Oracle的hints调整机制介绍
Oracle Hints 用法大全,对于优化 SQL 很有帮助!
hints 使用的好的話很好用。在进行sql执行过程中,由于有时候系统自动优化的方式并不是最优的。需要我们手工添加hint来提高查询效率。
oracle HINTS用法,自己平时整理的一些关于ORACLE HINTS的用法
Spec for Extended Window Manager Hints. version 1.4 draft2
101 Helpful Hints for IELTS
TJA1020应用笔记
maven-hints-3.1.4-sources.jar
:rocket: 安装npm i vue-dom-hints :vertical_traffic_light: 设置将其作为安装到Vue: import DomHints from 'vue-dom-hints'Vue . use ( DomHints ) 在构建中将其禁用以进行生产: if ( process . env . NODE_ENV...
Oracle中关于hints的语义及使用情况的介绍。
解析Oracle Hints.解析Oracle Hints.
NXP CAN收发器 应用指南 AH2002 'TJx144x/TJx146x Application Hints'
npm install react-hints --save 用法 将react-hints导入您的组件。 import Hint from 'react-hints' ; 在渲染中,使用组件包装一些元素。 这是包装的<button /> : < button className = "btn btn-lg...
Hints for Computer System Design - Microsoft.pdf Kruchten 2006 architecture 10 years.pdf On_the_Design_and_Development_of_Program.pdf Programmin_In_Large_versus_In_Small-Kron.pdf Software Architecture...