您当前的位置: 首页 > 数据库教程 > MySQL教程 > SQL Server表变量对IO及内存影响测试

SQL Server表变量对IO及内存影响测试

作者:不详 来源:网络 发布时间: 2014-07-17 09:02 点击:
1. 测试创建表变量对IO的影响 测试创建表变量前后,tempdb的空间大小,目前使用sp_spaceused得到大小,也可以使用视图sys.dm_db_file_space_usage 14use tempdb go Set nocount on Exec sp_spaceused /*插入数据之前*/ declare @tmp_orders table ( list_no int,id int

SQL Server表变量对IO及内存影响测试

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

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

  14use 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如下:

  30declare @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的空间。在所在批处理结束后,占用会被清除
分享到:
本文"SQL Server表变量对IO及内存影响测试"由远航站长收集整理而来,仅供大家学习与参考使用。更多网站制作教程尽在远航站长站。
顶一下
(0)
0%
踩一下
(0)
0%
[点击 次] [返回上一页] [打印]
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
关于本站 - 联系我们 - 网站声明 - 友情连接- 网站地图 - 站点地图 - 返回顶部
Copyright © 2007-2013 www.yhzhan.com(远航站长). All Rights Reserved .
远航站长:为中小站长提供最佳的学习与交流平台,提供网页制作与网站编程等各类网站制作教程.
官方QQ:445490277 网站群:26680406 网站备案号:豫ICP备07500620号-4