SQLSERVER 临时表和表变量到底有什么区别?
一:背景
1. 讲故事
今天和大家聊一套面试中经常被问到的高频题,对,就是 临时表
和 表变量
这俩玩意,如果有朋友在面试中回答的不好,可以尝试看下这篇能不能帮你成功迈过。
二:到底有什么区别
1. 前置思考
不管是 临时表
还是 表变量
都带了 表
这个词,既然提到了 表
,按推理自然会落到某一个 数据库
中,如果真在一个 数据库
中,那自然就有它的存储文件 .mdf 和 .ldf,那是不是如我推理的那样呢? 查阅 MSDN 的官方文档可以发现,临时表
和 表变量
确实都会使用 tempdb 这个临时存储数据库,而且 tempdb 也有自己的 mdf,ndf,ldf 文件,截图如下:
有了这个大思想之后,接下来就可以进行验证了。
2. 如何验证都存储在 tempdb 中 ?
要想验证其实很简单,sqlserver 提供了多种方式观察。
-
查询的过程中观察 tempdb 下是否存在
xxx
表。 -
使用动态管理视图
sys.dm_db_session_space_usage
查询当前sql占用tempdb下的数据页个数。
为了让测试效果明显,我分别插入 10w 条记录观察 数据页
占用情况。
- 临时表插入 10w 条记录
CREATE TABLE #temp
(id INT,content CHAR(4000) DEFAULT 'aaaaaaaaaa'
);
GO
INSERT INTO #temp(id)
SELECT TOP 100000ROW_NUMBER() OVER (ORDER BY o1.object_id) AS id
FROM sys.objects AS o1,sys.objects AS o2;
GOSELECT * FROM sys.dm_db_session_space_usage
WHERE session_id=@@SPID;
从图中的 user_objects_alloc_page_count=50456
看,当前的 insert 操作占用了 50456 个数据页。
接下来展开 tempdb
数据库以及观察到的 mdf 文件大小,都验证了存储到 tempdb 这个结论。
- 表变量插入 10w 条记录
因为表变量的特殊性,这里我故意暂停 1min
让查询迟迟得不到结束,在这期间方便展开 tempdb,重启 sqlserver 恢复初始状态后,执行如下 sql:
DECLARE @temp TABLE
(id INT,content CHAR(4000) DEFAULT 'aaaaaaaaaa'
);
INSERT INTO @temp(id)
SELECT TOP 100000ROW_NUMBER() OVER (ORDER BY o1.object_id) AS id
FROM sys.objects AS o1,sys.objects AS o2;SELECT * FROM sys.dm_db_session_space_usage
WHERE session_id=@@SPID;WAITFOR DELAY '00:01:00'
从图中可以看到 表变量
也会占用 5w+ 的数据页并且数据文件会膨胀。
3. 不同点在哪里
对底层存储有了了解之后,接下来按照重要度从高到低来了解一下区别吧。
- 临时表有统计信息,而表变量没有
所谓的 统计信息
,就是对表数据绘制一个 直方图
来掌握数据的分布情况,sqlserver 在择取较优的执行计划时会严重依赖于这个 直方图
,由于展开不了 Statistics
列,这里就从执行计划上观察,如下图所示:
- 临时表下的执行计划
选中 SELECT * FROM #temp WHERE id > 10 AND id<20;
之后点击 SSMS 的评估执行计划按钮来观察下评估执行计划,可以清晰的看到 sqlserver 知道表中有多少条记录,截图如下:
- 表变量下的执行计划
由于表变量的批处理性,我们用 SET STATISTICS XML ON
把 xml 查询出来,然后点击观察可视化视图,参考sql 如下:
DECLARE @temp TABLE
(id INT,content CHAR(4000) DEFAULT 'aaaaaaaaaa'
);
INSERT INTO @temp(id)
SELECT TOP 100000ROW_NUMBER() OVER (ORDER BY o1.object_id) AS id
FROM sys.objects AS o1,sys.objects AS o2;SET STATISTICS XML ON
SELECT * FROM @temp WHERE id > 10 AND id<20;
SET STATISTICS XML OFF
从图中可以清晰的看到,虽然表变量有 10w
条记录,但由于没有统计信息,sqlserver 也就无法知道这张表的数据分布,所以就按照默认值 1
条来计算。
从这里大家也能看得出来,如果 表记录
的真实条数 和 默认的 1 严重偏移的话,会给生成执行计划
造成重大失误,这个大家一定要当心了。
- 其它使用上的区别
除了上一个本质上的不同,接下来就是一些使用上的不同了,比如:
- 临时表是 session 级的,表变量是 批处理 级
所谓的批处理,就是以 go 为界定,两者就是作用域上的不同。
- 临时表可以后续修改,表变量不能后续修改。
这里的修改涉及到 字段,索引,整体上来说临时表在使用上和普通表趋同,表变量不能进行后续修改。
三:总结
总的来说,表变量
没有统计信息,也不可以后续做 DDL 操作,这种情况下 表变量
比 临时表
更轻量级,不会有如下副作用:
- DDL 修改导致执行计划过期重建
- sqlserver 对 统计信息 的维护压力
其实在这种作用域下高频的创建和删除表的操作中,表变量会让系统压力减轻很多。
但阳事总会有阴事来均衡它,一旦 表变量
的记录条数严重偏移默认的 1条
,会污染sqlserver的执行计划择取,可能会让你的 sql 遭受灭顶之灾,所以一定要控制 表变量
的记录条数,最好在百条内 。
最后的建议是:如果你是个小白可以无脑使用 临时表
,90%的情况下都可以做到通杀,如果你是个高手可以考虑一下 表变量
。
相关文章:
SQLSERVER 临时表和表变量到底有什么区别?
一:背景 1. 讲故事 今天和大家聊一套面试中经常被问到的高频题,对,就是 临时表 和 表变量 这俩玩意,如果有朋友在面试中回答的不好,可以尝试看下这篇能不能帮你成功迈过。 二:到底有什么区别 1. 前置思…...
技术生态异军突起,昇思MindSpore进入AI框架第一梯队
ChatGPT掀起的新一轮人工智能狂欢下,隐藏在背后的“大模型”正进入越来越多开发者的视野。 诚如几年前开始流行的一种说法:数据是燃料、模型是引擎、算力是加速器。ChatGPT的出现,恰如其分地诠释了数据、模型和算力的“化学反应”。而在其中…...
审批流、工作流、业务流
是业务流、工作流、审批流 业务流:即业务流程,指为了完成某项业务而进行的各种工作的有序组合 工作流:即工作流程,指为了完成某项工作而进行的各种动作的有序组合 审批流:即审批流程,是对某项工作的审批活动…...
如何利用知识库加强内部管理?
许多公司都知道需要有一个面向客户的知识库,以加强客户服务,提供更好的客户体验。 但是很多企业没有意识到的是,拥有一个内部知识库软件对于员工改善沟通和促进知识共享的重要性。 协作是组织成功的关键部分,通过明确的远景和使…...
饕餮 NFT 作品集来袭!
饕餮 NFT 作品集包含 Chili Game 创作的体验《饕餮》第一章中的角色。可以在 The Sandbox 农历新年活动期间(01/18/23 至 02/28/23)体验。 饕餮的故事植根于中国古代神话,主要灵感来自《山海经》,一个关于捉妖人「青蛙侠」的故事。…...
C++中的内存分区、引用、函数
内存分区模型 代码区 存放CPU执行的机器指令代码区是共享的且具有只读性 全局区 全局变量和静态变量都存放在此处全局区还包括了常量区、字符串常量和其他常量也存放在此该区域的数据在程序结束后由操作系统释放const修饰的局部变量并不算在全局区 栈区 由编译器自动分配和释放…...
关于angular表格total模板中一直为0
哈喽 小伙伴们大家好昨天在用angular得antdesign组件得table表格 我用total模板 结果,total一直为0这可是愁坏我了 <ng-template #totalTemplate let-total>找到 {{ total }} 条结果</ng-template>[nzShowTotal]"totalTemplate"最后找到原因了…...
多线程事务怎么回滚
背景介绍1,最近有一个大数据量插入的操作入库的业务场景,需要先做一些其他修改操作,然后在执行插入操作,由于插入数据可能会很多,用到多线程去拆分数据并行处理来提高响应时间,如果有一个线程执行失败&…...
基于FPGA的时间数字转换(TDC)设计(五:基于Carry4的高精度TDC设计)
1.基于Carry4进位链设计原理 常见的基于FPGA开发的TDC有直接计数法,多相位时钟采样法,抽头延迟线法等,之前内容为基于多相位的TDC,本章节中,主要讲解基于抽头延迟线法。在Xilinx FPGA开发中,实现抽头延迟线法有很多种,如使用IODELAY构建延迟进位链,此处将介绍基于Carr…...
【C++】二叉搜索树的实现(递归和非递归实现)
文章目录1、二叉搜索树1.1 构建二叉搜索树1.2 二叉搜索树的插入1.3 二叉搜索树的删除1.4 二叉搜索树插入和删除的递归实现为了学习map和set的底层实现,需要知道红黑树,知道红黑树之前需要知道AVL树。 红黑树和AVL树都用到了二叉搜索树结构,所…...
春招来了,如何正确使用领英超高效招聘海外员工、挖掘人才?
金三银四到了,每年的这个时候都是企业招聘的好时机。而领英是目前全球最大的职场社交网络平台,基本上海外求职都是在使用它,所以很多企业涉及到海外招聘时,都会优先考虑领英,但是却经常缺乏一些经验技巧,今…...
Mysql中锁机制深入理解
Mysql中锁机制深入理解默认大家已经知道。分类性能悲观锁,乐观锁操作类型读锁,写锁,数据粒度表锁,行锁,页面锁更细粒度间隙锁,临键锁按使用来讲。由数据粒度出发。表锁,分为 共享锁,…...
去中心化社交网络协议除了Nostr还有哪些?
当下最火的去中心化社交软件Dmaus就是基于Nostr协议开发的,Nostr协议的基本情况之前的文章《一文了解去中心化社交网络协议Nostr》已经做了详细介绍,本文将介绍其他几个目前比较流行的去中心化社交协议。FarcasterFarcaster是由前Coinbase高管Dan Romero…...
【FT2000/4+X100】调试记录
订阅专栏 硬件环境FT2000/4+X100,单板结构,对外显示,运行银行麒麟操作系统。 一 生成UEFI.BIN,烧写在FT2000-4的QSPI Flash中 1 2 下载源文件 edk2-for-support.tar; 参考文件 ft2004c&D2000编译打包说明V1.0.5; 解压源文件; 根目录下 build2004C.sh为四核产品…...
我的Android启动优化—【黑白屏优化】
简述 在Android App使用过程中,对于应用的优化是一个加分项,举个例子,打开你的App需要2秒,人家0.5秒,这就是很大的用户体验上的优化。 问题的产生 在开发中,我们在启动app的时候,屏幕会出现一…...
TongWeb8编码设置说明
应用场景:在遇到中文问题时,常需要通过设置编码格式来解决问题。下面介绍TongWeb8的编码设置及优先级。一、web.xml中请求、响应编码的配置优先级最高在JavaEE8规范中web.xml增加了request, response编码配置,该配置优先级最高。<?xml ve…...
不同相机之间图片像素对应关系求解(单应性矩阵求解)
一、场景 相机1和相机2相对位置不变,相机拍摄图片有重叠,求他们交叠部分的一一对应关系。数学语言描述为已知相机1图片中P点像素(u1, v1),相机1中P点在相机2图片中像素值为(u2, v2),它们存在某种变换,求变换矩阵。 因为…...
远程管理时代,还得是智能化PDU才靠得住!
在如今这个信息技术高速发展的时代,数据中心IDC机房服务器数量与日俱增,提供DNS域名服务、主机托管服务、虚拟主机服务等服务的服务器是IDC最基本的功能之一。服务器需要7*24小时不间断持续工作,但当服务器数量很大,服务器工作、重…...
通俗易懂理解——布隆过滤器
文章目录概述本质优缺点优点:缺点:实际应用解决redis缓存穿透问题:概述 本质 本质:很长的二进制向量(数组) 主要作用:判断一个数据在这个数组中是否存在,如果不存在为0,…...
TypeScript 学习之类型推导
在一些情况下,代码上没有显性明确类型,typescript 可以隐形推断出类型。 基础 let x 3;变量x的类型被推断为数字。 类型推断发生在初始化变量和成员,设置默认参数值和决定函数返回值时 最佳通用类型 let x [0, 1, null]; // 类型为 numb…...
Android四大组件——Service详解
Service 为后台运行,不可见,没有界面。优先级高于Activity(内存不足时先杀掉Activity),运行在主线程且不能做耗时操作。 一、Service 启动方式 1、startService() 通过 startService 启动后,service会一直…...
svg转png
svg转png写了一个spring boot项目,支持传入svg文件转出png图片,并且自定义转出png的宽和高。主要代码如下:所需依赖如下:演示如下:首先,运行项目使用接口调用工具调用接口发送请求,提取文件1000…...
教你如何搭建人事OA-员工管理系统,demo可分享
1、简介1.1、案例简介本文将介绍,如何搭建人事OA-员工管理。1.2、应用场景人事OA-员工管理应用对员工信息进行管理,可办理入职、转正、离职等流程。2、设置方法2.1、表单搭建1)新建表单【员工管理】,字段设置如下:名称…...
C++递推基础知识
文章目录一、递推的概念二、递推和递归的区别三、递推的实例1、最基础的:斐波那契数列2、变形版斐波那契数列3、较复杂的递推式求解:昆虫繁殖4、经典逆推问题:题目数量一、递推的概念 1、什么是递推算法? 递推算法:是…...
【Python入门第十天】Python 布尔
布尔表示两值之一:True 或 False。 布尔值 在编程中,通常需要知道表达式是 True 还是 False。 可以计算 Python 中的任何表达式,并获得两个答案之一,即 True 或 False。 比较两个值时,将对表达式求值,P…...
WebDAV之π-Disk派盘+Piktures
Piktures支持WebDAV方式连接π-Disk派盘。推荐一款简单易用,功能超级强大的智能相册应用。Piktures智能相册是一款简单易用,功能超级强大的智能相册应用,它不仅可以访问本地和云照片,还可以照片编辑器,而且它同时还是一…...
Revit问题:Navisworks中导入的rvt模型角度不正确调整
一、Navisworks中导入的rvt模型角度不正确调整方法 通常情况下,我们做好一个Revit模型,有时候出于成果保护或者鉴于Revit自带的碰撞检测效果不够直观、Revit模型体量太大,需要一个轻量化的模型展示,我们通常情况下会使用Autodesk公…...
最全正则验证
一、校验数字的表达式 1. 数字:^[0-9]*$ 2. n位的数字:^\d{n}$ 3. 至少n位的数字:^\d{n,}$ 4. m-n位的数字:^\d{m,n}$ 5. 零和非零开头的数字:^(0|[1-9][0-9]*)$ 6. 非零开头的最多带两位小数的数字:…...
阿里云服务器入门使用流程 新手学习教程
一、阿里云根据个人需要选合适的云服务器,选好cpu、内存、带宽,地域,这四个是主要的。其他可以默认选择。 二、登陆控制台 输入账号密码,进去看到服务界面,新手可能不容易看懂。点击左侧菜单,点击云服务器…...
git学习
一.实际场景 数据备份代码还原协同开发追溯问题代码的编写人和编写时间 二.Git工作流程图 三.获取本地仓库 四.git add和git commit git status:查看修改的状态(暂存区,工作区) git add . :通配符,添加当…...
贵州贵阳网站开发/如何推广网站运营
今天给大家介绍一下经典的开源机器学习软件: 编程语言:搞实验个人认为当然matlab最灵活了(但是正版很贵),但是更为前途的是Python(numpyscipymatplotlib)和C/C,这样组合既可搞研究,也…...
网站备案 信息查询/seo优化点击软件
Mysql将查询结果集转换为JSON数据前言学生表学生成绩表查询单个学生各科成绩(转换为对象JSON串并用逗号拼接)将单个学生各科成绩转换为数组JSON串将数组串作为value并设置key两张表联合查询(最终SQL,每个学生各科成绩)最终结果前言 我们经常会…...
上广东建设厅网站/北京网上推广
HTTP 头部解释 以下内容摘抄于:https://www.cnblogs.com/jiangxiaobo/p/5499488.html 1. Accept:告诉WEB服务器自己接受什么介质类型,*/* 表示任何类型,type/* 表示该类型下的所有子类型,type/sub-type。 2. Accept-…...
wordpress中文视频教程/站长工具seo综合查询论坛
text-shadow文本阴影 微信小程序交流群:111733917 | 微信小程序从0基础到就业的课程:https://edu.csdn.net/topic/huangjuhua 基础用法 在 CSS3 中,text-shadow 属性向文本添加一个或多个阴影。该属性是逗号分隔的阴影列表,每个…...
网站制作书籍推荐/百度指数官网登录
建筑给排水工程包括:给水、排水、热水、消火栓、自动喷淋等常用系统,其管道当中流动的是水。(其管道输送介质为水)一、给排水工程的主要功能(1)建筑给水系统的任务,就是经济合理地将水由室外给水管网输送到装置在室内的各种配水龙头、生产用水…...
顺德公司网站制作/广西南宁做网站的公司
在C#里面,属性的get 与 set 非常简单方便。 public class bird {public int age { get;set; } public bool isadult{get {return this.age > 1 ? true:false;}} }而在Python里面,属性可以直接获取或赋值。但是如果在获取或赋值时加一些逻辑判断&am…...