当前位置: 首页 > article >正文

CTE、临时表、子查询如何选?

在 SQL Server 等关系型数据库中处理复杂查询逻辑时子查询 (Subquery)、临时表 (Temporary Table) 和公共表表达式 (CTE, Common Table Expression) 是三种核心工具。它们各有优劣选择哪种取决于具体的性能需求、数据规模、代码可读性以及结果集复用情况 。没有绝对的“最佳”只有“最适合”当前场景的方案。一、核心特性对比下表综合了三者的核心差异是决策的基础 维度子查询 (Subquery)临时表 (Temporary Table)CTE (Common Table Expression)本质与生命周期嵌套在主查询内部的查询。存储在tempdb中的物理表会话或显式删除后消失。逻辑上的“命名查询”仅在定义它的SELECT、INSERT、UPDATE或DELETE语句执行期间有效。性能简单场景如IN、EXISTS筛选高效。复杂或相关子查询可能导致O(n²)性能退化 。性能最稳定可控。可创建索引优化连接和筛选适合处理大数据量的中间结果 。性能接近子查询是语法糖优化器可能将其展开为子查询。对于大数据集性能通常不如有索引的临时表 。可读性与维护嵌套层级多时代码难以阅读和维护 。中等。需要管理表的创建、插入和清理但调试时可直接查询中间数据非常方便 。可读性最佳。能将复杂查询拆解为逻辑清晰的步骤显著提升代码可维护性 。复用性不可复用。可复用。创建后可在同一会话的后续多个查询中重复使用。不可复用。仅在紧随其后的单个SELECT语句中有效。特殊功能无。可创建索引、统计信息支持事务控制。支持递归查询是处理树形或层次结构数据的首选 。资源消耗不产生额外的物理存储开销。消耗tempdb的存储和 I/O 资源可能成为瓶颈 。不占用物理存储除非被物化如在某些数据库的特定版本中。二、选择决策指南与具体场景基于以上对比可以形成以下决策流程是否需要递归查询是 → 选择 CTE。这是 CTE 的独有优势用于查询组织架构、评论树、BOM物料清单等层级数据 。否 → 进入下一步判断。中间结果是否需要被多次引用是 → 优先考虑临时表。例如一个复杂的聚合结果需要在后续多个报表或计算中被使用。临时表可以避免重复计算这是 CTE 和子查询无法做到的 。否 → 进入下一步判断。数据量有多大查询逻辑有多复杂数据量小逻辑简单→选择子查询或 CTE。例如简单的IN过滤或单次使用的中间逻辑。此时 CTE 在可读性上胜出。-- 使用 CTE 提升可读性即使逻辑简单 WITH HighValueCustomers AS ( SELECT CustomerID, SUM(OrderAmount) AS TotalAmount FROM Orders GROUP BY CustomerID HAVING SUM(OrderAmount) 10000 ) SELECT c.CustomerName, hvc.TotalAmount FROM Customers c JOIN HighValueCustomers hvc ON c.CustomerID hvc.CustomerID;数据量大逻辑复杂或需要性能调优→选择临时表。尤其是当连接、筛选操作在中间结果上进行时为其创建索引能带来巨大性能提升 。-- 使用临时表处理大数据量分步计算 -- 第一步将大表聚合结果存入临时表并可创建索引 SELECT CustomerID, ProductID, SUM(Quantity) AS TotalQty, AVG(UnitPrice) AS AvgPrice INTO #SalesSummary FROM Sales WHERE SaleDate ‘2023-01-01’ GROUP BY CustomerID, ProductID; CREATE INDEX idx_Cust ON #SalesSummary(CustomerID); -- 为后续连接创建索引 -- 第二步利用索引化的临时表进行高效查询 SELECT c.CustomerName, ss.ProductID, ss.TotalQty FROM Customers c JOIN #SalesSummary ss ON c.CustomerID ss.CustomerID WHERE ss.AvgPrice 100; DROP TABLE #SalesSummary; -- 显式清理可选是否极度强调代码清晰度和可维护性是 → 优先选择 CTE。它将复杂的多步查询转化为线性、易于理解的代码块便于团队协作和后期维护 。三、进阶考虑与混合使用数据库差异上述讨论主要基于 SQL Server。在PostgreSQL中CTE 的行为有重要区别在PostgreSQL 12 之前CTE 会被物化即像临时表一样先计算并存储结果这可能带来不必要的性能开销而子查询则更容易被优化器与主查询融合INLINING从而利用索引 。PostgreSQL 12 及之后版本优化器可以内联 CTE但仍需注意。混合模式在实际项目中可以组合使用。例如使用CTE来清晰定义递归部分或逻辑步骤然后将最终结果插入临时表供后续复杂分析使用兼顾可读性与性能 。总结对于“CTE vs 临时表 vs 子查询选哪个”这个问题最终的答案是一个权衡决策追求极致性能和大数据处理→临时表。追求代码清晰、可维护或需要递归查询→CTE。处理简单、一次性的过滤逻辑→子查询或使用 CTE 以获得更好可读性。应根据具体的数据量、查询复杂度、复用需求、可维护性要求以及所使用的数据库类型和版本来做出最合适的选择 。参考来源SQL Server 中子查询、临时表与 CTE 的选择与对比SQL Server 中子查询、临时表与 CTE 的选择与对比PostgreSQL里的子查询和CTE居然在性能上“掐架”到底该站哪边CTE与临时表优劣势对比及使用场景分析通过使用CTE和临时表优化查询的性能对比CTE vs 子查询深入拆解PostgreSQL复杂SQL的隐藏性能差异

相关文章:

CTE、临时表、子查询如何选?

在 SQL Server 等关系型数据库中,处理复杂查询逻辑时,子查询 (Subquery)、临时表 (Temporary Table) 和公共表表达式 (CTE, Common Table Expression) 是三种核心工具。它们各有优劣,选择哪种取决于具体的性能需求、数据规模、代码可读性以及…...

HybridCLR Generate All报错终极解决指南:UnityLinker.exe找不到HotUpdate.dll怎么办?

HybridCLR Generate All报错终极解决指南:UnityLinker.exe找不到HotUpdate.dll怎么办? 当你正在使用HybridCLR进行Unity热更新开发时,突然遇到Generate All报错,提示UnityLinker.exe无法解析HotUpdate.dll,这确实会让人…...

RK3588开发板跑YOLOv5视频流demo,遇到Segmentation fault别慌!保姆级core文件生成与调试指南

RK3588开发板YOLOv5视频流推理崩溃排查:从Segmentation fault到精准调试全攻略 当你在RK3588开发板上满心期待地运行YOLOv5视频流推理demo时,屏幕上突然闪现的"Segmentation fault (core dumped)"就像一盆冷水浇灭了热情。这种崩溃提示信息量极…...

S3 文件操作进阶实践:从基础上传到完整性保障

1. S3文件操作的核心挑战与解决方案 第一次接触AWS S3时,很多人会觉得文件上传下载不就是调用几个API的事?但真正投入生产环境后,各种问题就会接踵而至。我见过最典型的案例是某电商平台在促销期间,因为文件上传没有做完整性校验…...

深度解析IDM激活脚本:注册表锁定技术的完整实现指南

深度解析IDM激活脚本:注册表锁定技术的完整实现指南 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script Internet Download Manager(IDM&…...

用Rust还是JavaScript?Tauri 2.0系统托盘开发的两种姿势与选型建议

Tauri 2.0系统托盘开发:Rust与JavaScript的技术选型深度解析 当桌面应用需要常驻后台运行时,系统托盘功能便成为用户体验的关键组件。Tauri 2.0作为新一代跨平台桌面框架,允许开发者在前端JavaScript与后端Rust两种技术栈中实现这一功能。本文…...

深度解析Mi-Create:开源智能手表表盘编辑器的完整实践指南

深度解析Mi-Create:开源智能手表表盘编辑器的完整实践指南 【免费下载链接】Mi-Create Unofficial watchface creator for Xiaomi wearables ~2021 and above 项目地址: https://gitcode.com/gh_mirrors/mi/Mi-Create 项目愿景与定位 在智能穿戴设备快速发展…...

5分钟完成专业级黑苹果配置:OpCore Simplify终极简化指南

5分钟完成专业级黑苹果配置:OpCore Simplify终极简化指南 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 你是否曾经为黑苹果配置的复杂性…...

本地图片检索新方案:ImageSearch完全使用指南

本地图片检索新方案:ImageSearch完全使用指南 【免费下载链接】ImageSearch 基于.NET8的本地硬盘千万级图库以图搜图案例Demo和图片exif信息移除小工具分享 项目地址: https://gitcode.com/gh_mirrors/im/ImageSearch 当你的电脑中存储了成千上万张图片&…...

(宏)Word题注自动化:从“图一-1”到“图1-1”的VBA实现与高效复用

1. 为什么需要题注自动化? 写论文或者技术文档的朋友肯定遇到过这样的烦恼:每次插入图片后,都要手动输入"图1-1"、"图1-2"这样的题注。更麻烦的是,如果你的章节标题用的是中文数字(比如"第一…...

医疗陪护管理系统:信息化管理在医院的应用

博主介绍: 所有项目都配有从入门到精通的安装教程,可二开,提供核心代码讲解,项目指导。 项目配有对应开发文档、解析等 项目都录了发布和功能操作演示视频; 项目的界面和功能都可以定制,包安装运行&#xf…...

Easy-Scraper:革新性HTML数据提取库的技术突破与实战应用

Easy-Scraper:革新性HTML数据提取库的技术突破与实战应用 【免费下载链接】easy-scraper Easy scraping library 项目地址: https://gitcode.com/gh_mirrors/ea/easy-scraper 在数据驱动决策的时代,网页数据采集已成为企业获取市场情报、科研机构…...

短剧小程序源码:打造你的专属短剧平台

温馨提示:文末有资源合作获取方式~一、市场前景:千亿蓝海,风口正当时“昨晚又为一部短剧熬夜了!”这已成为当代年轻人的日常。3分钟一集,连续反转,极致爽点——短剧正以惊人的速度占领我们的碎片…...

基于Altera Cyclone4 FPGA-EP4CE15F17C8核心板的硬件设计实战(原理图+PCB+AD09工程)

1. 从零开始搭建FPGA核心板硬件系统 第一次接触FPGA核心板设计时,我被密密麻麻的引脚和复杂的电源系统搞得头晕眼花。直到用AD09完整走完EP4CE15F17C8核心板的设计流程,才发现硬件开发就像搭积木——只要掌握模块化思维,菜鸟也能做出专业级设…...

避坑指南:Cypress CYT4B的Mcal CAN配置,这5个参数配错直接通信失败

Cypress CYT4B的Mcal CAN配置实战:5个致命参数解析与避坑策略 实验室里,示波器上的CAN波形杂乱无章,工程师反复检查硬件连接却始终无法建立稳定通信——这可能是许多嵌入式开发者调试CYT4B系列芯片时的真实写照。当硬件排查无果后&#xff0c…...

极客专属:OpenClaw+百川2-13B打造个人CLI智能助手

极客专属:OpenClaw百川2-13B打造个人CLI智能助手 1. 为什么开发者需要命令行智能助手 作为一个长期与终端打交道的开发者,我每天要重复执行大量机械操作:查看日志、运行测试、整理结果。这些工作虽然简单,却极其消耗精力。直到我…...

嵌入式正交编码器软件解码库设计与实现

1. QuadratureEncoder 库概述QuadratureEncoder 是一个专为嵌入式系统设计的正交编码器信号处理库,面向 STM32、ESP32、nRF52 等主流 MCU 平台,提供高精度、低开销、抗干扰的旋转位置与速度检测能力。该库不依赖特定硬件外设(如 STM32 的 TIM…...

从零封装一个 Vue 低代码表单组件:我是如何借鉴 FcDesigner 的设计思路的

从零封装一个 Vue 低代码表单组件:我是如何借鉴 FcDesigner 的设计思路的 低代码开发正在改变前端工程师的工作方式。作为一名长期深耕表单领域的前端开发者,我曾参与过多个企业级低代码平台的搭建,也经历过从零开始封装表单组件的完整周期。…...

PCB设计新手必看:从零开始掌握PCB设计全流程

1. PCB设计入门:从零开始的完整指南 刚接触PCB设计时,我完全被各种专业术语和复杂流程搞懵了。直到自己动手做了几块板子,才发现其实只要掌握正确的方法,PCB设计并没有想象中那么难。这篇文章就是把我踩过的坑和积累的经验&#x…...

跨平台文件同步:OpenClaw+nanobot自动管理NAS文档

跨平台文件同步:OpenClawnanobot自动管理NAS文档 1. 为什么需要自动化文件管理? 作为一个长期被多设备文件同步问题困扰的用户,我一直在寻找一个既安全又灵活的解决方案。我的日常工作涉及MacBook、Windows台式机和家庭NAS之间的文件流转&a…...

别光看原理了!用STM32F407从零撸一个四轴飞控代码(附完整工程)

用STM32F407从零构建四轴飞控代码实战指南 当你在论坛上看到别人分享的无人机飞行视频,是否也曾心动想亲手打造一套自己的飞控系统?市面上大多数教程止步于理论讲解,真正落实到代码层面的少之又少。本文将带你用STM32F407开发板,…...

保姆级教程:手把手教你安装并激活DevExpress 20.1.3(附资源与注册机使用避坑指南)

深度指南:DevExpress 20.1.3开发环境高效配置与资源管理 在.NET生态系统中,DevExpress始终以其强大的控件库和高效的开发工具占据重要地位。对于刚接触这个工具集的开发者来说,如何快速搭建一个稳定的开发环境往往成为项目启动的第一道门槛。…...

OpenClaw对话增强:nanobot模型微调提升任务理解准确率

OpenClaw对话增强:nanobot模型微调提升任务理解准确率 1. 为什么需要专业场景的模型微调 在测试OpenClaw基础版本时,我发现一个明显痛点:当处理专业领域的自动化任务时,通用大模型经常出现"理解偏差"。比如在医疗文献…...

冒险岛V128单机版服务端魔改指南:从基础搭建到自定义任务/装备修改

冒险岛V128单机版深度定制指南:从零构建个性化游戏世界 在数字娱乐的黄金时代,怀旧游戏焕发新生已成为一种文化现象。作为横版卷轴网游的经典之作,冒险岛凭借其独特的艺术风格和社交属性,至今仍拥有大量忠实玩家。而单机版的出现&…...

OpenClaw技能扩展实战:基于Qwen3-32B开发自定义文件处理器

OpenClaw技能扩展实战:基于Qwen3-32B开发自定义文件处理器 1. 为什么需要自定义文件处理器 上周处理季度数据时,我又遇到了那个老问题:手头有37个CSV文件需要清洗格式、去重合并,还要按日期归档。这种重复性工作既耗时又容易出错…...

快速找回Chrome密码:ChromePass终极使用指南

快速找回Chrome密码:ChromePass终极使用指南 【免费下载链接】chromepass Get all passwords stored by Chrome on WINDOWS. 项目地址: https://gitcode.com/gh_mirrors/chr/chromepass 你是否曾经因为忘记Chrome浏览器中保存的重要登录密码而感到困扰&#…...

8路HD-SDI录播主机CYS-08

在广电录制、教育录播、会议记录等场景中,稳定、高清、易管理的视频录制设备至关重要。春源丽影CYS-08 推出的8路HD-SDI硬盘录像机,凭借全接口支持、双编码技术、智能存储等核心优势,为多路高清录制需求提供了专业级解决方案。8路高清输入&am…...

技术指标——格雷厄姆指数

文章目录1. 格雷厄姆指数是什么?2. 格雷厄姆指数的作用是什么?3. 举例计算例1:牛市顶部(2021年2月)例2:熊市底部(2024年2月)例3:中性水平(假设某一般时刻&…...

IDEA插件开发实战:手把手教你开发首个效率工具(附GitHub源码)

IDEA插件开发实战:从零打造你的专属效率工具 JetBrains系列IDE的强大之处不仅在于其核心功能,更在于其开放的插件生态系统。作为一名Java开发者,你是否曾想过为IDEA添加一个能提升自己工作效率的专属工具?本文将带你从零开始&…...

保研党必看:用本科论文逆袭IEEE二区期刊的5个关键操作(含时间管理秘籍)

保研党必看:用本科论文逆袭IEEE二区期刊的5个关键操作(含时间管理秘籍) 在保研竞争日益激烈的当下,一篇高质量的学术论文往往能成为决定成败的关键。对于大多数本科生来说,科研经历有限、资源匮乏是普遍面临的困境。但…...