惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

小众软件
小众软件
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
WordPress大学
WordPress大学
月光博客
月光博客
Hugging Face - Blog
Hugging Face - Blog
博客园 - 聂微东
博客园 - 【当耐特】
博客园_首页
The Cloudflare Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Apple Machine Learning Research
Apple Machine Learning Research
Last Week in AI
Last Week in AI
酷 壳 – CoolShell
酷 壳 – CoolShell
大猫的无限游戏
大猫的无限游戏
雷峰网
雷峰网
量子位
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog
IT之家
IT之家
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
GbyAI
GbyAI
V
Visual Studio Blog
F
Fortinet All Blogs
Martin Fowler
Martin Fowler

博客园 - tohen

浏览器视频文件分段缓存合并成完整的视频 我爷爷吸烟,我爸爸也吸烟,轮到我不能断了香火 线程封装组件(BackgroundWorker)和线程(Thread) SQL2008R2的 遍历所有表更新统计信息 和 索引重建 对比:重建索引与更新统计 试试SQLServer 2014的内存优化表 Sql server2014 内存优化表 本地编译存储过程 SQL Server 2016 查询存储性能优化小结 公用表表达式(CTE) 获取应用程序根目录物理路径(Web and Windows) 【别人的老师VS你的老师 】同样是老师,差别怎么这么大呢!? SQL Server 用SSMS查看依赖关系有时候不准确,改用代码查 SQL Server 百万级数据提高查询速度的方法 SQL server 数据库备份还原Sql 在计算列中创建索引提高性能 SQL Server读懂语句运行的统计信息 SET STATISTICS TIME IO PROFILE ON SQL Server对Xml字段的操作 为什么洗澡时你会灵感乍现 SQL Server存储过程中使用表值作为输入参数示例
测试创建表变量对IO的影响
tohen · 2017-09-11 · via 博客园 - tohen

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

复制代码

use tempdb
go
Set nocount on
Exec 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,id
from Test.dbo.Orders             
Select top(1) name,object_id,type,create_date
from sys.objects 
Where type='U' Order by create_date Desc            
Exec sp_spaceused /*插入数据之后*/
Go
Exec 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,id
from 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_id
WHERE database_id = db_id()
GROUP BY name, index_id 
ORDER BY cached_pages_count DESC

复制代码

测试结果如下:

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

3. 结论

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