【问题标题】:Sql Server Xml Column Best PracticesSql Server Xml 列最佳实践
【发布时间】:2011-04-01 21:27:40
【问题描述】:

使用 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 数据!

谢谢

皮特

【问题讨论】:

  • 一定要创建 XML 索引!

标签: sql-server database-design xml-column


【解决方案1】:

来自XML Best Practices for Microsoft SQL Server 2005

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

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

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

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

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

  • 您有 XML 数据的架构,并且希望服务器能够 根据以下验证您的 XML 数据 XML 架构。
  • 您希望利用基于存储和查询优化的 关于类型信息。
  • 您希望在期间更好地利用类型信息 汇编您的查询,例如 静态类型错误。

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

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

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

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

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

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

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

【讨论】:

  • 哇,关于这个 remus 的答案非常彻底,谢谢。这无疑让我深思熟虑,并提供了大量关键字和搜索词来进一步研究。
【解决方案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

【讨论】:

  • 再次感谢蓝色信息和链接 +1。
猜你喜欢
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
  • 1970-01-01
  • 2018-01-30
  • 1970-01-01
  • 1970-01-01
  • 2013-07-27
  • 1970-01-01
相关资源
最近更新 更多