with结构语法使用踩坑,总结了下CTE语法使用的优缺点和使用场景!

前言:因为习惯with语法结构,一般超过三层或者超过四张表我就是用CTE语法,这样逻辑清晰,辨识度高,但是偶尔要调整内存分配,在增效降本的时代,内存金贵,重新优化过程中,发现未触发合并逻辑,导致没有存进内存导致重复计算的问题。记录分享。

一、CTE关联方式的优点

  1. 逻辑清晰性
    CTE将复杂查询拆分为多个逻辑模块,通过命名临时表降低嵌套层级,使多表关联逻辑更直观易懂‌14。例如,分层定义订单、支付、商品明细等模块,再通过主查询关联整合数据。
  2. 代码复用性
    同一CTE可在主查询中多次引用,避免重复编写相同子查询逻辑(如过滤条件、聚合计算),减少冗余代码‌。
  3. 递归查询支持
    若涉及层次化数据(如树形结构),可通过WITH RECURSIVE实现递归逻辑,简化树形数据遍历‌。
  4. 执行计划优化潜力
    部分场景下,Hive/MySQL等引擎可能将CTE结果缓存复用,减少重复计算,提升性能‌。

二、CTE关联方式的缺点

  1. 性能不确定性
    若CTE被多次引用且无法缓存,可能导致重复计算(如未触发优化器合并逻辑),增加资源消耗‌。
  2. 作用域限制
    CTE仅在当前查询中有效,无法跨会话或查询复用,长期复用逻辑需改用视图或临时表‌。
  3. 内存占用风险
    复杂CTE可能生成大量中间结果,占用内存或磁盘空间,尤其在分布式系统中易引发数据倾斜‌。
  4. 关联复杂度提升
    多CTE关联时需严格管理JOIN条件和字段引用(如用户案例中漏关联oda表导致报错),增加调试难度‌。

三、适用场景建议

  • 推荐使用场景‌:
    多层嵌套查询、重复子查询逻辑、递归数据处理、需分步调试的复杂关联‌。
  • 慎用场景‌:
    简单查询(过度拆分反而降低可读性)、对性能敏感的实时处理、内存资源受限环境‌。

通过权衡逻辑清晰性与性能成本,CTE关联方式在复杂查询中优势显著,但需结合执行计划分析(如EXPLAIN)验证优化效果‌。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值