达梦数据库-with as性能优化记录

客户反馈达梦数据库在使用withas时,主查询执行效率低。原因在于withas未被当作临时表缓存,多次查询导致重复。优化建议包括将标量主查询改写为CASE-WHEN和在withas后添加rownum>0以利用缓存。测试显示,添加rownum后执行计划显示了HEAPTABLESCAN,表明问题得以解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题背景:

with as(

……

)t1

SELECT
        (
                SELECT count(distinct )

                FROM t1

                where money>=500000
        ) A1,
        (
                SELECT count(distinct case_id)
                FROM  t1
                where money>=400000
                    and money <500000
        )B1
        (
                SELECT count(distinct )

                FROM t1
        )
        C1
FROM
        dual;

1、  客户反馈,在with as内容中,Oracle和达梦两边SQL执行效率一致。但是在主查询中达梦的执行效率很慢。
2、  判断问题sql在达梦数据库中没有把with as 作为临时temp表使用,从执行计划看,主查询中做了表连接展开,with as内容存在多次查询的情况。失去了with as作为缓存查询的意义。导致重复查询。
3、  优化建议:
(方法1)、主查询中,标量主查询可以改写为case when的形式
(方法2)、with as (…… rownum > 0) 结尾添加  --客户采用建议,问题解决

分析优化和测试过程记录:

1、正常达梦数据库with as 的执行计划,HEAP TABLE SCAN,作为缓存表使用,每次cost不变。

问题sql的执行计划中未体现出该访问路径。尝试在with as ()中加入rownum>0,执行计划出现heap table缓存表。

测试:

达梦数据库 - 新一代大型通用关系型数据库 | 达梦在线服务平台

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值