3

使用 Sql server Xml 列以确保快速性能和易于报告的最佳实践是什么?

你如何设置列?您是否将其保留为未键入?或将其与架构相关联?

将 xml 列与架构相关联会提高查询性能吗?

我们对xml列的使用如下:

A.> 在每个客户的基础上,我们可以定义灵活的数据存储,而无需彻底检查我们的数据库。

B.> 我们需要为每个客户构建报告视图,返回他们的数据,就好像它是一个简单的表格(对于水晶报告或 Sql Server Reporting Services)。

我们目前用来查询的语法如下:

SELECT 
Id, 
doc.value('@associatedId','nvarchar(40)') as AssocId,
doc.value('@name1', 'nvarchar(255)') as Name1,
doc.value('@name2', 'nvarchar(255)') as Name2,
doc.value('@name3', 'nvarchar(255)') as Name3,
doc.value('@number', 'nvarchar(255)') as Number
From OrderDetails
CROSS APPLY OrderDetails.XmlData.nodes('//root/reviewers/reviewer') as XmlTable(doc)

有没有更快的方法来做到这一点?这个查询在一个有 100 万条记录的表中运行缓慢,但目前只有 800 条有 xml 数据!

谢谢

皮特

4

2 回答 2

5

来自Microsoft SQL Server 2005 的 XML 最佳实践

使用类型化或非类型化 XML?

在以下情况下使用无类型XML 数据类型:

  • 您没有 XML 数据的模式。
  • 您有模式,但您不希望服务器验证数据。

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

在以下条件下使用类型化XML 数据类型:

  • 您有 XML 数据的模式,并且您希望服务器根据 XML 模式验证您的 XML 数据。
  • 您希望利用基于类型信息的存储和查询优化。
  • 您希望在编译查询(例如静态类型错误)期间更好地利用类型信息。

类型化的 XML 列、参数和变量可以存储 XML 文档或内容,您必须在声明时将其指定为标志(分别为 DOCUMENT 或 CONTENT)。此外,您必须提供一个或多个 XML 模式。如果每个 XML 实例只有一个顶级元素,则指定 DOCUMENT;否则,请使用内容。查询编译器在查询编译期间在类型检查中使用 DOCUMENT 标志来推断单例顶级元素。

将 xml 列与架构相关联会提高查询性能吗?请参阅上面的一点:如果您想利用基于类型信息的查询优化,请使用类型化XML 。

关于 XML 索引的好处还有一个冗长的讨论:

在以下情况下,您的应用程序可能会受益于 XML 索引:

  • 对 XML 列的查询在您的工作负载中很常见。必须考虑数据修改期间的 XML 索引维护成本。
  • 您的 XML 值相对较大,检索到的部分相对较小。构建索引避免了在运行时解析整个数据,并有利于索引查找以实现高效的查询处理。

最重要的是,适合您使用的辅助XML 索引类型:

  • 如果您的工作负载在 XML 列上大量使用路径表达式,则PATH辅助 XML 索引可能会加快您的工作负载。最常见的情况是在Transact-SQL 子句中exist()对 XML 列使用方法。WHERE
  • 如果您的工作负载使用路径表达式从单个 XML 实例中检索多个值,那么在PROPERTY索引中的每个 XML 实例中聚类路径可能会有所帮助。这种场景通常发生在属性包场景中,当对象的属性被获取并且它的关系主键值是已知的时。
  • 如果您的工作负载涉及查询 XML 实例中的值而不知道包含这些值的元素或属性名称,您可能需要创建VALUE索引。这通常发生在后代轴查找中,例如//author[last-name="Howard"],其中<author>元素可以出现在层次结构的任何级别,并且搜索值("Howard")比路径更具选择性。它也出现在“通配符”查询中,例如/book [@* = "novel"],查询查找<book>具有某些属性值为 的元素"novel"
于 2010-08-21T00:40:21.177 回答
2

如果像上面的示例一样,您使用 XML 来存储各种字符串列,我认为您不会真正受益于类型化 XML,除非您需要服务器来验证数据。在性能方面,我怀疑它会更快无类型。

对于这些类型的查询,您绝对需要有适当的 XML 索引,它们对于 XML 查询的良好性能是必不可少的。如果没有索引,XML 列将存储为 blob,因此为了查询它们,SQL 需要先将 blob 分解为 XML,然后执行您请求的任何操作。主 XML 索引将粉碎的 XML 存储在数据库中,因此不需要即时完成。您需要先创建一个主 XML 索引,然后才能创建辅助 XML 索引来支持您的查询。

二级 XML 索引有 3 种类型:PATH、VALUE 和 PROPERTY。您需要哪些二级索引取决于您将要执行的查询类型,因此我鼓励您查看联机丛书中的二级 XML 索引主题以确定哪些对您有用: http:/ /msdn.microsoft.com/en-us/library/bb522562(SQL.100).aspx

于 2010-08-21T01:30:18.730 回答