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

日期: 2009-01-31 作者:Michelle Gutzait翻译:曾少宁 来源:TechTarget中国 英文

作为一个数据库管理员,我试着仔细分析性能问题以及如何保证使用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

官方微博

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结果(每一个插入的两次执行):

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的能源管理》等。

相关推荐