作为一个数据库管理员,我试着仔细分析性能问题以及如何保证使用XML时不要影响SQL Server性能。在本文中,我将向你介绍一个例子,它使用了两个表,一个用于插入和查询XML数据,而另一个使用VARCHAR(MAX)数据类型。然后我们观察存储、CPU和I/O的测试结果,从而为你的SQL Server环境作出最佳选择。 注意:这里使用的测试仅仅针对基本的表,不使用索引。
如果你对于在SQL Server使用T-SQL命令和XML AUTO的应用性能比较有兴趣,请阅读我的上一篇技巧文章。 XML数据类型 XML数据类型会由SQL Server在进行检查时与VARCHAR(MAX)比较,以保证它的内……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
作为一个数据库管理员,我试着仔细分析性能问题以及如何保证使用XML时不要影响SQL Server性能。在本文中,我将向你介绍一个例子,它使用了两个表,一个用于插入和查询XML数据,而另一个使用VARCHAR(MAX)数据类型。然后我们观察存储、CPU和I/O的测试结果,从而为你的SQL Server环境作出最佳选择。
注意:这里使用的测试仅仅针对基本的表,不使用索引。
如果你对于在SQL Server使用T-SQL命令和XML AUTO的应用性能比较有兴趣,请阅读我的上一篇技巧文章。
XML数据类型
XML数据类型会由SQL Server在进行检查时与VARCHAR(MAX)比较,以保证它的内容是合法的XML。
测试环境描述
对于我的测试,我将使用从一个*.rdl文件(Reporting Services Report)拷贝的XML,大小为265KB。我将创建两个有相同结构的表,只是其中的MyXML域,一个表使用XML数据类型,而另一个表使用VARCHAR(MAX)数据类型。
<create table TryVACRCHARDatatype( id int identity not null, MyXML VARCHAR(MAX) null ) Go create table TryXMLDatatype ( id int identity not null, MyXML XML null )Go |
我将用相同的方法向每一个表插入XML数据:
set statistics io on Go declare @XML XML -- My big XML (for space reasons I am not including all of it here) SET @XML = '<?xml version="1.0" encoding="utf-8"?> ……… ' insert into TryXMLDatatype (MyXML) values (@XML) go declare @Varch VARCHAR(MAX) -- My big XML (for space reasons I am not including all of it here) SET @Varch = '<?xml version="1.0" encoding="utf-8"?> ……… ' insert into TryXMLDatatype (MyXML) values (@Varch) Go |
插入XML数据到表中
我在SQL Profiler中监控上面的插入命令,并得到I/O统计,运行两次。
I/O统计结果:
TryXMLDatatype表。扫描次数:0,逻辑读取次数:1,物理读取次数:0,预读次数:0,慢速逻辑读取次数:18,慢速物理读取次数:0,慢速预读次数:0。
TryVACRCHARDatatype表。扫描次数:0,逻辑读取次数:1,物理读取次数:0,预读次数:0,慢速逻辑读取次数:90,慢速物理读取次数:0,慢速预读次数:0。
执行计划显示了两个命令的精确计划。
Profiler结果(每一个插入的两次执行):
注意:XML插入占用更多的CPU而读/写则比较少。同时插入XML数据需要时间更长。我将在下一部分分析这个行为。
查询表
I ran SELECT * FROM in each table and monitored with Profiler and Statistics I/O: SELECT * FROM TryXMLDatatype Go SELECT * FROM TryVACRCHARDatatype Go |
结果:
注意:域中的值是不同的!
I/O统计结果:
TryXMLDatatype表:扫描次数:0,逻辑读取次数:1,物理读取次数:0,预读次数:0,慢速逻辑读取次数:56,慢速物理读取次数:0,慢速预读次数:0。
TryVACRCHARDatatype表:扫描次数:0,逻辑读取次数:1,物理读取次数:0,预读次数:0,慢速逻辑读取次数:200,慢速物理读取次数:0,慢速预读次数:0。
XML数据类型占用更少的I/O。、
同样,执行计划成本显示了两个命令的完全相同的计划。
为什么两个表的读取操作差别这么大呢?
注意:查询XML的时间更长。时间延长的很多不同的因素是基于机器的活动。我将忽略这些不同点,主要是因为没有CPU显示。如果涉及到CPU活动,它可能解释了时间延长的不同点但是这并不是重点。
让我查询一下每一个表的字段长度:
SELECT datalength(MyXML) FROM TryXMLDatatype Go SELECT datalength(MyXML) FROM TryVACRCHARDatatype Go |
很意外,XML域的字符比另一个更少。原因如下:
XML--less I/O:
当插入XML数据类型时,“附加”数据,如引号和制表符会从域中删除。结果是更加节约了存储空间。
我尝试从XML字段拷贝值到VARCHAR(MAX)字段,如下:
truncate table TryVARCHARDatatype Go insert into TryVARCHARDatatype (MyXML) select convert(varchar(max),MyXML) from TryXMLDatatype Go |
翻译
TechTarget中国特约技术编辑,某高校计算机科学专业教师和网络实验室负责人,曾任职某网络国际厂商,关注数据中心、开发运维、数据库及软件开发技术。有多本关于思科数据中心和虚拟化技术的译著,如《思科绿色数据中心建设与管理》和《基于IP的能源管理》等。
相关推荐
-
SQL Server 2005支持服务结束 升级何去何从
SQL Server 2005的支持就要结束了,就在2016年4月12日,SQL Server 2005的客户们应该升级了。
-
SQL Server 2005即将终止服务 你准备好了么?
2016年4月12日,微软将正式终止SQL Server 2005相关服务。微软正在终止扩展支持,这意味着不再有新特性更新,什么都没了。
-
解决SQL服务器提示属性IsLocked不可用于登录用户的错误
在SQL Server中,权限的分配很重要。特别是在用户数量众多的数据库里面,用户权限,架构的划分经常会导致权限之间的冲突,导致无法登陆。
-
TT数据库特别推荐:SQL Server编年史
无论是菜鸟还是资深DBA,除了要掌握基本的数据库管理、操作之外,还需要对不同产品的发展历史有一个了解。