ORA-01013错误求助:查询层面优化方案(无法修改数据库超时)
解决ORA-01013超时问题的查询优化方案
针对你运行自连接SQL时出现的超时错误,以下是几个无需修改数据库配置的查询层面优化办法:
添加覆盖索引或强制使用现有索引
全表扫描是耗时的主要原因,先试试针对连接条件和返回字段创建组合索引,让Oracle直接从索引取数:CREATE INDEX IDX_FTTB_CONTRACT_MASTER_JOIN ON FCUBS.FTTB_CONTRACT_MASTER (CR_ACCOUNT, DR_ACCOUNT, PAYMENT_DETAILS2, CONTRACT_REF_NO);如果没权限创建新索引,查一下表上有没有包含
CR_ACCOUNT、DR_ACCOUNT的现有索引,有的话可以强制Oracle使用:SELECT /*+ INDEX(A 你的现有索引名) INDEX(B 你的现有索引名) */ A.CR_ACCOUNT, B.CR_ACCOUNT FROM FCUBS.FTTB_CONTRACT_MASTER A INNER JOIN FCUBS.FTTB_CONTRACT_MASTER B ON A.CR_ACCOUNT = B.DR_ACCOUNT AND A.DR_ACCOUNT = B.CR_ACCOUNT AND A.PAYMENT_DETAILS2 = B.CONTRACT_REF_NO;拆分查询分步执行
直接自连接大数据表容易超时,试试先把需要的字段筛选出来存临时表(有权限的话),再做连接:-- 创建临时表存基础数据 CREATE GLOBAL TEMPORARY TABLE TMP_CONTRACT_DATA ON COMMIT PRESERVE ROWS AS SELECT CR_ACCOUNT, DR_ACCOUNT, PAYMENT_DETAILS2, CONTRACT_REF_NO FROM FCUBS.FTTB_CONTRACT_MASTER; -- 基于临时表做连接 SELECT A.CR_ACCOUNT, B.CR_ACCOUNT FROM TMP_CONTRACT_DATA A INNER JOIN TMP_CONTRACT_DATA B ON A.CR_ACCOUNT = B.DR_ACCOUNT AND A.DR_ACCOUNT = B.CR_ACCOUNT AND A.PAYMENT_DETAILS2 = B.CONTRACT_REF_NO;要是不能创建临时表,换成EXISTS子句替代自连接,减少中间数据集:
SELECT A.CR_ACCOUNT, A.DR_ACCOUNT AS B_CR_ACCOUNT FROM FCUBS.FTTB_CONTRACT_MASTER A WHERE EXISTS ( SELECT 1 FROM FCUBS.FTTB_CONTRACT_MASTER B WHERE B.DR_ACCOUNT = A.CR_ACCOUNT AND B.CR_ACCOUNT = A.DR_ACCOUNT AND B.CONTRACT_REF_NO = A.PAYMENT_DETAILS2 );添加过滤条件缩小数据集
看看表有没有时间类字段(比如CREATE_DATE、UPDATE_DATE),加个范围过滤,只查近期数据,能大幅减少连接的数据量:SELECT A.CR_ACCOUNT, B.CR_ACCOUNT FROM FCUBS.FTTB_CONTRACT_MASTER A INNER JOIN FCUBS.FTTB_CONTRACT_MASTER B ON A.CR_ACCOUNT = B.DR_ACCOUNT AND A.DR_ACCOUNT = B.CR_ACCOUNT AND A.PAYMENT_DETAILS2 = B.CONTRACT_REF_NO WHERE A.CREATE_DATE >= TRUNC(SYSDATE) - 30; -- 按需调整时间范围简化返回字段
注意到你的查询返回A.CR_ACCOUNT和B.CR_ACCOUNT,但根据连接条件,B.CR_ACCOUNT其实等于A.DR_ACCOUNT,完全可以简化返回结果,减少数据传输量:SELECT A.CR_ACCOUNT, A.DR_ACCOUNT AS B_CR_ACCOUNT FROM FCUBS.FTTB_CONTRACT_MASTER A WHERE EXISTS ( SELECT 1 FROM FCUBS.FTTB_CONTRACT_MASTER B WHERE B.DR_ACCOUNT = A.CR_ACCOUNT AND B.CR_ACCOUNT = A.DR_ACCOUNT AND B.CONTRACT_REF_NO = A.PAYMENT_DETAILS2 );
内容的提问来源于stack exchange,提问作者nilesh chopadkar
相关产品推荐
相关产品推荐

