作为一个数据库管理员,我试着仔细分析性能问题以及如何保证使用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)数据类型。
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 = ' ……… ' 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 = ' ……… ' 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 |
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16436858/viewspace-604316/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/16436858/viewspace-604316/