为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:v8
【操作系统】:银河麒麟操作系统
【CPU】:hygon c86 7490 64-core processor
【问题描述】*:同一条sql 没加limit 1000 2S出来 加了8分钟出来,下面执行任务是线上的
select a.CustomerSerial,a.CustomerMobile
,a.CustomerType
,a.CUSTOMER_RISK_LEVEL
,a.CustomerSex Sex
,a.CustomerAge Age
,a.FinancialPlannerWorkNO
,a.NetWorkNo
FROM FBJR.WFT_Customer_All a
left join FBJR.WFT_Network b on a.NetWorkNo=b.NetworkNO
left join FBJR.Tb_Common_User c on a.FinancialPlannerWorkNO=c.WorkNO
where 1=1 and exists(select 1 from FBJR.IFS_CUST_RDEPOSIT_DHYXFZXT b1 where a.CustomerSerial=REPLACE(b1.CUSTID, 'PN', '') AND b1.ENDDATE>=20250101 AND b1.ENDDATE<=20250830) AND EXISTS(SELECT 1 FROM FBJR.WFT_Network WHERE NetworkNO=a.NetworkNO AND PParentNO='BR15000') limit 1000
加limit 1000
没有加limit1000
IFS_CUST_RDEPOSIT_DHYXFZXT 这张表的关联条件里,用了表达式 REPLACE(b1.CUSTID, 'PN', '')
如果这个表达式条件是必须的,那测试下加一个函数索引看看能否用得上
CREATE INDEX IDX_IFS_CUST_RDEPOSIT_DHYXFZXT_TST1 ON IFS_CUST_RDEPOSIT_DHYXFZXT(REPLACE(CUSTID, 'PN', ''),ENDDATE);
另外,刷一下这个SQL用到的几张表的统计信息,可以用下面这个方式一次性刷这个SQL用到的几张表
SP_SQL_STAT_INIT('查询语句');
--或者,先用查询语句创建个临时视图,然后调用过程的方式来处理,省得替换单引号啥的
CREATE OR REPLACE VIEW V_FORSTAT
AS
查询语句;
SP_SQL_STAT_INIT('SELECT * FROM V_FORSTAT');
加个hint enable_hash_join(0) 看下执行时间以及执行计划