博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQLServer表变量对IO及内存影响测试
阅读量:5757 次
发布时间:2019-06-18

本文共 2242 字,大约阅读时间需要 7 分钟。

原文:

1. 测试创建表变量对IO的影响

测试创建表变量前后,tempdb的空间大小,目前使用sp_spaceused得到大小,也可以使用视图sys.dm_db_file_space_usage

use tempdbgoSet nocount onExec sp_spaceused /*插入数据之前*/declare @tmp_orders table ( list_no int,id int)insert into @tmp_orders(list_no,id)select ROW_NUMBER() over( order by Id  ) list_no,idfrom Test.dbo.Orders             Select top(1) name,object_id,type,create_datefrom sys.objects Where type='U' Order by create_date Desc            Exec sp_spaceused /*插入数据之后*/GoExec sp_spaceused /*Go之后*/

执行结果如下:

可以看到:

1) 在表变量创建完毕,同时批处理语句没有结束时,临时库的空间增大了接近9M空间。创建表变量的语句结束后,空间释放

2)在临时库的对象表sys.objects中能够查询到刚刚创建的表变量对象

 

继续验证是否发生IO操作,使用视图sys.dm_io_virtual_file_stats

在创建表变量前后执行如下语句:

select db_name(database_id) database_name,*from sys.dm_io_virtual_file_stats(db_id('tempdb'), NULL)

测试结果如下:

1* 创建表变量前

2*创建表变量后

 

可以看到数据文件写入次数以及写入字节发生了明显的变化,比较写入字节数:
select (2921709568-2913058816)*1.0/1024/1024
 
大约为8.3M,与表变量的数据基本一致,可见创建表变量,确实是发生了IO操作
 
2. 测试创建表变量对内存的影响
考虑表变量是否占用内存的数据缓冲区,测试SQL如下:
declare @tmp_orders table ( list_no int,id int)insert into @tmp_orders(list_no,id)select ROW_NUMBER() over( order by Id  ) list_no,idfrom Test.dbo.Orders   --查询tempdb库中最后创建的对象         Select top(1) name,object_id,type,create_date from sys.objects Where type='U' Order by create_date Desc  --查询内存中缓存页数 SELECT count(*)AS cached_pages_count     ,name ,index_id FROM sys.dm_os_buffer_descriptors AS bd     INNER JOIN     (        SELECT object_name(object_id) AS name             ,index_id ,allocation_unit_id        FROM sys.allocation_units AS au            INNER JOIN sys.partitions AS p                 ON au.container_id = p.hobt_id                     AND (au.type = 1 OR au.type = 3)        UNION ALL        SELECT object_name(object_id) AS name               ,index_id, allocation_unit_id        FROM sys.allocation_units AS au            INNER JOIN sys.partitions AS p                 ON au.container_id = p.partition_id                     AND au.type = 2    ) AS obj         ON bd.allocation_unit_id = obj.allocation_unit_idWHERE database_id = db_id()GROUP BY name, index_id ORDER BY cached_pages_count DESC

测试结果如下:

可以看到表变量创建后,数据页面也会缓存在Buffer Pool中。但所在的批处理语句结束后,占用空间会被释放。

 

3. 结论

SQL Server在批处理中创建的表变量会产生IO操作,占用tempdb的空间,以及内存bufferPool的空间。在所在批处理结束后,占用会被清除

 

参考文章:

如有不对的地方,欢迎拍砖,谢谢!O(∩_∩)O

转载地址:http://mmpkx.baihongyu.com/

你可能感兴趣的文章
SparkSQL Catalyst解析
查看>>
jSearch(聚搜) 1.0.0 终于来了
查看>>
Java字节码结构剖析二:字段表
查看>>
盘点2018云计算市场,变化大于需求?
查看>>
极光推送(一)集成
查看>>
Android项目实战(三十九):Android集成Unity3D项目(图文详解)
查看>>
MySQL 8.0 压缩包版安装方法
查看>>
TensorFlow系列专题(六):实战项目Mnist手写数据集识别
查看>>
JS中this的4种绑定规则
查看>>
Netty Pipeline源码分析(2)
查看>>
@Transient注解输出空间位置属性
查看>>
Ansible-playbook 条件判断when、pause(学习笔记二十三)
查看>>
开发者报 | Github造假产业链曝光,花钱就能买Star;黑客又多一个可以偷你密码的方法了...
查看>>
git 相关开发常用
查看>>
编码服务正在步入云端
查看>>
我的友情链接
查看>>
mysql备份
查看>>
数组合并
查看>>
Linux学习笔记--Linux文件管理类命令详解
查看>>
进程间的通信方式
查看>>