ms sql serverxml 最佳实践数据库技巧.docx

上传人:b****6 文档编号:7560676 上传时间:2023-01-25 格式:DOCX 页数:24 大小:38.50KB
下载 相关 举报
ms sql serverxml 最佳实践数据库技巧.docx_第1页
第1页 / 共24页
ms sql serverxml 最佳实践数据库技巧.docx_第2页
第2页 / 共24页
ms sql serverxml 最佳实践数据库技巧.docx_第3页
第3页 / 共24页
ms sql serverxml 最佳实践数据库技巧.docx_第4页
第4页 / 共24页
ms sql serverxml 最佳实践数据库技巧.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

ms sql serverxml 最佳实践数据库技巧.docx

《ms sql serverxml 最佳实践数据库技巧.docx》由会员分享,可在线阅读,更多相关《ms sql serverxml 最佳实践数据库技巧.docx(24页珍藏版)》请在冰豆网上搜索。

ms sql serverxml 最佳实践数据库技巧.docx

mssqlserverxml最佳实践数据库技巧

MSSQLServer2005XML最佳实践

SQLServer2005为XML数据处理提供了广泛支持。

可以将XML值以本机方式存储在xml数据类型列中,后者可以根据XML架构的集合进行类型化,也可以保持非类型化状态。

可以对XML列创建索引。

此外,通过使用XQuery和XMLDML可支持精细的数据操作。

XMLDML是针对数据修改的扩展。

SQLServer2000和SQLXMLWeb版本提供了强大的XML数据管理功能。

这些功能着重于关系数据和XML数据之间的映射。

可以使用带批注的XSD(AXSD)来定义关系数据的XML视图,以提供以XML为中心的方法,该方法支持对XML数据执行大容量数据加载、查询和更新功能。

Transact-SQL扩展提供了一个以SQL为中心的方法,以便使用FORXML将关系查询结果映射到XML,以及使用OPENXML从XML生成关系视图。

这些支持已在SQLServer2005中进行了扩展。

结合新添加的本机XML支持,SQLServer2005提供了一个强大的平台,以针对半结构化和非结构化数据管理开发功能丰富的应用程序。

本主题提供了SQLServer2005中的XML数据建模和使用准则,包含下列两个部分:

数据建模

可以通过使用本机xml数据类型和拆分到表中的XML,以多种方式在SQLServer2005中存储XML数据。

本主题提供了为对XML数据进行建模做出适当选择的准则。

另外,还介绍了对XML数据创建索引、属性提升和XML实例的类型化。

使用

本部分讨论了与使用相关的主题,例如将XML数据加载到服务器和查询编译中的类型推理。

本部分还解释和区分了密切相关的功能,并就如何适当使用这些功能提出了建议。

这些均通过示例进行了说明。

数据建模

本部分概述了应使用SQLServer2005中的XML功能的理由,另外还提供了在本机XML存储和XML视图技术之间进行选择的准则,并给出了数据建模建议。

关系或XML数据模型

如果您的数据是高度结构化的,具有已知架构,则对于数据存储,关系模型可能最适用。

SQLServer提供了您可能需要的必要功能和工具。

另一方面,如果结构是半结构化或非结构化的或者未知的,则必须考虑对这类数据进行建模。

如果您需要一个与平台无关的模型,以便通过使用结构和语义标记来确保数据的可移植性,则XML是一个不错的选择。

此外,下列情况下,适于做此选择:

您的数据为稀疏数据,或您不了解数据的结构,或数据结构将来可能会有重大变化。

您的数据体现的是包容层次结构而不是在实体间的引用,并且可能是递归数据。

您的数据本身具有顺序性。

您希望基于数据的结构查询数据或更新部分数据。

如果上述条件均不满足,则应使用关系数据模型。

例如,如果数据为XML格式,但应用程序只是使用数据库来存储和检索数据,则只需要[n]varchar(max)列。

将数据存储在XML列中还有其他好处,包括让引擎确定数据格式是否正确或有效,以及支持对XML数据进行精细查询和更新。

在SQLServer2005中存储XML数据的理由

下面是一些使用SQLServer2005中的本机XML功能而不是在文件系统中管理XML数据的理由:

您希望以一种高效的事务处理方式来共享、查询和修改XML数据。

精细的数据访问对于您的应用程序而言很重要。

例如,您可能需要提取XML文档中的某些部分,或者您可能需要插入新的部分而不是替换整个文档。

您有关系数据和XML数据,希望在应用程序中进行关系数据和XML数据之间的互操作。

您需要语言支持,以便对于跨域应用程序可以进行查询和数据修改。

您希望服务器能够保证数据格式正确,并能够视情况根据XML架构来验证您的数据。

您希望对XML数据创建索引以实现高效的查询处理和良好的可伸缩性,并使用一流查询优化器。

您希望对XML数据进行SOAP、ADO.NET和OLEDB访问。

您希望使用数据库服务器的管理功能来管理XML数据。

例如,这可能是备份、恢复和复制。

如果上述条件均不满足,最好将数据存储为非XML大型对象类型,如[n]varchar(max)或varbinary(max)。

XML存储选项

SQLServer2005中的XML存储选项包括:

采用xml数据类型的本机存储

数据以保留数据的XML内容的内部表示形式进行存储,XML内容包括包容层次结构、文档顺序、元素和属性值等。

具体来说,就是保留XML数据的InfoSet内容。

有关InfoSet的详细信息,请访问http:

//www.w3.org/TR/xml-infoset。

InfoSet内容并不是文本XML的精确副本,因为其中未保留下列信息:

无关紧要的空格、属性顺序、命名空间前缀和XML声明。

对于类型化的xml数据类型(即绑定到XML架构的xml数据类型),后架构验证InfoSet(PSVI)将类型信息添加到InfoSet,并以内部表示形式进行编码。

这会显著提高分析速度。

有关详细信息,请参阅http:

//www.w3.org/TR/xmlschema-1和http:

//www.w3.org/TR/xmlschema-2上的W3CXML架构规范。

在XML和关系存储之间映射

通过使用带批注的架构(AXSD),将XML分解到一个或多个表中的列。

这可保留在关系级别上的数据保真度。

因此,尽管忽略了元素间的顺序,但仍保留了层次结构。

架构不能是递归的。

大型对象存储[n]varchar(max)和varbinary(max)

存储数据的精确副本。

这对于特殊用途的应用(如法律文档)很有用。

大多数应用不需要完全相同的副本,且XML内容(InfoSet保真度)即可满足需要。

通常,您必须结合使用这些方法。

例如,您可能需要将XML数据存储在xml数据类型列中,并将其中的属性提升到关系列中。

或者,您可能需要使用映射技术将非递归部分存储到非XML列中,而只将递归部分存储在xml数据类型列中。

XML技术的选择

XML技术(本机XML与XML视图)的选择通常取决于下列因素:

存储选项

您的XML数据可能更适于大型对象存储(例如,产品手册),或更适于存储在关系列中(例如,转换为XML的行项)。

每个存储选项都在不同程度上保留文档保真度。

查询功能

您可能会发现,基于查询的特性和对XML数据进行查询的程度,某一个存储选项比其他选项更合适。

在两个存储选项中,对XML数据的精细查询(例如,XML节点上的谓词评估)得到不同程度的支持。

对XML数据创建索引

您可能希望对XML数据创建索引以提高XML查询的性能。

索引选项随存储选项的不同而不同,您必须做出适当的选择才能优化工作负荷。

数据修改功能

某些工作负荷涉及对XML数据进行精细修改。

例如,在文档中添加新的部分,而其他工作负荷(如Web内容)则不涉及。

对于您的应用程序来说,数据修改语言支持可能很重要。

架构支持

您的XML数据可通过架构进行说明,该架构可能是XML架构文档,也可能不是。

对架构绑定的XML的支持取决于XML技术。

此外,不同的选择具有不同的性能特征。

本机XML存储

您可以将XML数据存储在服务器上的XML数据类型列中。

下列情况下,适于做此选择:

您希望使用一种简单的方法将XML数据存储在服务器上,同时保留文档顺序和文档结构。

您可能有对应于您的XML数据的架构,也可能没有。

您希望查询和修改XML数据。

您希望对XML数据创建索引,以提高查询处理的速度。

您的应用程序需要系统目录视图以管理您的XML数据和XML架构。

如果您的XML文档具有多种结构,或您的XML文档符合不同的或复杂的架构,而这些架构很难映射到关系结构,本机XML存储很有用。

示例:

使用xml数据类型对XML数据进行建模

例如有一个XML格式的产品手册,其中每个主题对应单独的一章,而每章中又包含多节。

一节可以包含多个小节。

因此,

是一个递归元素。

产品手册包含大量混合内容、关系图和技术材料;数据是半结构化的。

用户可能希望对感兴趣的主题执行上下文搜索,例如,在有关“索引”的章中搜索有关“聚集索引”的节,并查询技术数量。

适于您的XML文档的存储模型是xml数据类型列。

这可保留XML数据的InfoSet内容。

对XML列创建索引有利于提高查询性能。

示例:

保留XML数据的精确副本

为了进行说明,假定政府条例要求您保留XML文档的精确文本副本。

例如,这些文档可能为签署的文档、法律文档或股票交易单。

您可能希望将文档存储在[n]varchar(max)列中。

查询时,先在运行时将数据转换为xml数据类型,然后对其执行Xquery。

运行时转换开销可能很高,尤其是在文档较大的情况下。

如果经常查询,可以采取冗余方式将文档存储在xml数据类型列中,并对其创建索引,同时从[n]varchar(max)列中返回精确的文档副本。

XML列可以是基于[n]varchar(max)列的计算列。

但不能对XML计算列创建XML索引,也不能对[n]varchar(max)或varbinary(max)列创建XML索引。

XML视图技术

通过定义XML架构和数据库中的表之间的映射,可以创建持久性数据的“XML视图”。

通过XML视图,可使用XML大容量加载来填充基础表。

您可以使用XPath1.0版来查询XML视图;这种查询将被转换为针对表的SQL查询。

与此类似,更新也会被传播到那些表。

在下列情况下,此技术很有用:

您希望拥有以XML为中心的编程模型,该模型使用现有关系数据上的XML视图。

您有对应于您的XML数据的架构(XSD、XDR),该架构可能由外部伙伴提供。

数据中的顺序并不重要,或查询表数据不是递归的,或事先已知最大递归深度。

您希望使用XPath1.0版通过XML视图查询和修改数据。

您希望通过XML视图来大容量加载XML数据,并将其分解到基础表。

相关示例包括显示为用于数据交换和Web服务的XML的关系数据。

有关详细信息,请参阅MSDNOnlineLibrary。

示例:

使用带批注的XML架构(AXSD)对数据进行建模

为了进行说明,假定您具有希望将其作为XML处理的关系数据(如客户、订单和行项)。

请使用AXSD在关系数据上定义XML视图。

通过使用XML视图可以将XML数据大容量加载到表,以及使用XML视图查询和更新关系数据。

如果必须在SQL应用程序不间断工作时与其他应用程序交换包含XML标记的数据,该模型很有用。

混合模型

通常,对于数据建模,适于结合使用关系列和xml数据类型列。

可以将XML数据中的某些值存储在关系列中,而将其余或全部XML值存储在XML列中。

这可获得更好的性能,您可以更好地控制对关系列创建的索引和锁定特征。

要存储在关系列中的值取决于您的工作负荷。

例如,如果基于路径表达式/Customer/@CustId检索所有XML值,则将CustId属性的值提升到关系列并对其创建索引可以获得更快的查询性能。

另一方面,如果您的XML数据是以非冗余方式广泛地分解为关系列中,则重新汇集的开销可能很大。

对于高度结构化的XML数据,例如,表的内容已转换为XML,您可以将所有值映射到关系列,并且可能使用XML视图技术。

使用xml数据类型进行数据建模

本部分讨论有关本机XML存储的数据建模主题,包括对XML数据创建索引、属性提升和类型化的xml数据类型。

相同或不同的表

可以在包含其他关系列的表中,或在与主表具有外键关系的单独表中创建xml数据类型列。

如果满足下列条件之一,请在同一个表中创建xml数据类型列:

您的应用程序对XML列执行数据检索,并且不需要XML列的XML索引。

您希望对xml数据类型列生成XML索引,并且主表的主键与其聚集键相同。

有关详细信息,请参阅“对xml数据类型列创建索引”。

如果满足下列条件,请在单独的表中创建xml数据类型列:

您希望对xml数据类型列生成XML索引,但主表的主键与其聚集键不同,或主表没有主键,或主表是一个堆(即没有聚集键)。

如果主表已存在,可能会这样。

您不希望因为表中存在XML列而降低表扫描的速度。

无论该列是存储在行内还是行外,都会占用空间。

XML数据的粒度

XML列中存储的XML数据的粒度对锁定至关重要,在一定程度上,对更新也很重要。

SQLServer对XML数据和非XML数据都使用相同的锁定机制。

因此,行级锁定会导致锁定行中的所有XML实例。

当粒度较大时,锁定大型XML实例以便进行更新会导致多用户情况下的吞吐量下降。

另一方面,过度分解会丢失对象封装,并增加重新汇集开销。

对于良好的设计而言,重要的是保持数据建模要求与锁定和更新特征之间的平衡。

但在SQLServer2005中,实际存储的XML实例的大小并不十分重要。

例如,通过使用对部分二进制大型对象(BLOB)和部分索引更新(将存储的现有XML实例与其更新后的版本进行比较)的新支持,对XML实例进行更新。

部分二进制大型对象(BLOB)更新在两个XML实例之间执行差异比较,并只更新差异之处。

部分索引更新只修改那些必须在XML索引中更改的行。

非类型化、类型化和约束的xml数据类型

SQLServer2005xml数据类型实现了ISOSQL-2003标准xml数据类型。

因此,它可以在非类型化的XML列中存储格式正确的XML1.0版的文档、具有文本节点和任意数量顶级元素的所谓的XML内容片段。

系统将检查数据格式是否正确,但不要求将列绑定到XML架构,并且拒绝在扩展意义上格式不正确的数据。

对于非类型化的XML变量和参数也是如此。

如果您有说明XML数据的XML架构,则可以将架构与XML列相关联以产生类型化的XML。

XML架构用于验证数据,在编译查询和数据修改语句过程中执行比非类型化的XML更精确的类型检查,以及优化存储和查询处理。

在下列情况下,请使用非类型化的xml数据类型:

您没有对应于您的XML数据的架构。

您有架构,但不希望服务器验证数据。

当应用程序在将数据存储到服务器之前执行客户端验证时,或临时存储根据架构确定无效的XML数据时,或在服务器上使用不受支持的架构组件(如key/keyref)时,有时会出现这种情况。

在下列情况下,请使用类型化的xml数据类型:

您有对应于您的XML数据的架构,并且希望服务器根据XML架构验证XML数据。

您希望充分利用基于类型信息的存储和查询优化。

您希望在编译查询过程中更好地充分利用类型信息。

类型化的XML列、参数和变量可以存储XML文档或内容。

但是,必须使用标志指定在声明时是存储文档还是存储内容。

此外,必须提供XML架构集合。

如果每个XML实例都刚好有一个顶级元素,请指定DOCUMENT。

否则,请使用CONTENT。

查询编译器在编译查询过程中的类型检查中使用DOCUMENT标志以推断单一的顶级元素。

除了对XML列进行类型化之外,还可以对类型化或非类型化的xml数据类型列使用关系(列或行)约束。

在下列情况下,请使用约束:

无法在XML架构中表达业务规则。

例如,花店的交货地址必须在其营业地点周围50英里之内。

这可以编写为XML列的约束。

约束可能涉及xml数据类型方法。

您的约束涉及表中的其他XML列或非XML列。

例如,强制使XML实例中的客户ID(/Customer/@CustId)与CustomerID关系列中的值匹配。

文档类型定义(DTD)

可以使用XML架构来对xml数据类型列、变量和参数进行类型化,但不能使用DTD进行此项操作。

但是,内联DTD既可用于非类型化的XML,也可用于类型化的XML,以便提供默认值,并将实体引用替换为其扩展形式。

可以通过使用第三方工具将DTD转换为XML架构文档,然后将XML架构加载到数据库中。

对xml数据类型列创建索引

可以对xml数据类型列创建XML索引。

它将对列中XML实例的所有标记、值和路径进行索引,从而提高查询性能。

在下列情况下,您的应用程序可以从XML索引中获益:

对XML列进行查询在您的工作负荷中很常见。

必须考虑数据修改过程中的XML索引维护开销。

XML值相对较大,而检索的部分相对较小。

生成索引避免了在运行时分析所有数据,并且索引查找有利于进行高效的查询处理。

XML列的第一个索引是主XML索引。

使用它时,可以对XML列创建三种类型的辅助XML索引,以提供常见种类的查询的速度,如以下部分所述。

主XML索引

这将对XML列中XML实例的所有标记、值和路径进行索引。

基表(即包含XML列的表)的主键必须具有聚集索引。

主键用于将索引行与基表中的行相关联。

可从XML列中检索完整的XML实例,例如SELECT*。

查询使用主XML索引,并通过使用索引本身返回标量值或XML子树。

示例:

创建主XML索引

在大多数示例中,使用包含非类型化的XML列的表T(pkINTPRIMARYKEY,xColXML)。

可以采用简单的方式将这些示例扩展为类型化的XML。

有关如何使用类型化的XML的详细信息,请参阅xml数据类型。

为简化起见,针对XML数据实例说明了查询,如下所示:

复制代码

WritingSecureCode

Michael

Howard

David

LeBlanc

39.99

以下语句对表T的XML列xCol创建XML索引(名为idx_xCol):

复制代码

CREATEPRIMARYXMLINDEXidx_xColonT(xCol)

辅助XML索引

创建了主XML索引之后,您可能希望创建辅助XML索引来提高工作负荷中不同种类查询的速度。

三种类型的辅助XML索引(即PATH、PROPERTY和VALUE)分别用于优化基于路径的查询、自定义属性管理方案和基于值的查询。

PATH索引功能是按文档顺序对列中的所有XML实例生成各个XML节点的(path,value)对的B+树。

PROPERTY索引功能是创建各个XML实例中(PK,path,value)对的聚集B+树,其中PK是基表的主键。

最后,VALUE索引功能是按文档顺序对XML列中的所有XML实例创建每个节点的(value,path)对的B+树。

下面是创建一个或多个这些索引的一些准则:

如果工作负荷对XML列大量使用路径表达式,则PATH辅助XML索引可能会提高工作负荷的处理速度。

最常见的情况是在Transact-SQL的WHERE子句中对XML列使用exist()方法。

如果工作负荷通过使用路径表达式从单个XML实例中检索多个值,则在PROPERTY索引中聚集各个XML实例中的路径可能会很有用。

这种情况通常出现在属性包方案中,此时提取对象的属性并且已知其主键值。

如果工作负荷涉及查询XML实例中的值,但不知道包含那些值的元素名称或属性名称,则您可能希望创建VALUE索引。

这通常出现在descendant轴查找中,例如//author[last-name="Howard"],其中元素可以出现在层次结构的任何级别上。

这种情况也出现在通配符查询中,例如/book[@*="novel"],其中查询将查找具有某个值为“novel”的属性的元素。

示例:

基于路径的查找

为了进行说明,假定以下查询在您的工作负荷中很常见:

复制代码

SELECTpk,xColFROMTWHERExCol.exist(/book/@genre[.="novel"])=1

路径表达式/book/@genre和值“novel”对应于PATH索引的键字段。

因此,PATH类型的辅助XML索引对此工作负荷很有用:

复制代码

CREATEXMLINDEXidx_xCol_PathonT(xCol)USINGXMLINDEXidx_xColFORPATH

示例:

提取对象的属性

例如,下面的查询从表T中的各行检索书的属性genre、title和ISBN:

复制代码

SELECTxCol.value((/book/@genre)[1],varchar(50)),xCol.value((/book/title/text())[1],varchar(50)),xCol.value((/book/@ISBN)[1],varchar(50))FROMT

在这种情况下,属性索引很有用,其创建方式如下:

复制代码

CREATEXMLINDEXidx_xCol_PropertyonT(xCol)USINGXMLINDEXidx_xColFORPROPERTY

示例:

基于值的查询

在下面的查询中,descendant-or-self(//)指定部分路径,以便基于ISBN值的查找从VALUE索引的使用中获益。

复制代码

SELECTxColFROMTWHERExCol.exist(//book/@ISBN[.="0-7356-1588-2"])=1

VALUE索引的创建方式如下:

复制代码

CREATEXMLINDEXidx_xCol_ValueonT(xCol)USINGXMLINDEXidx_xColFORVALUE

对XML列的全文索引

您可以对XML列创建一个全文索引,该索引对XML值的内容进行索引,但忽略XML标记。

属性值不

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 面试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1