SQL Server 2005的XML数据类型和VARCHAR(MAX)之一

作为一个数据库管理员,我试着仔细分析性能问题以及如何保证使用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结果(每一个插入的两次执行):

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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值