SQL Server Xml列最佳实践

Pet*_*ter 3 sql-server database-design xml-column

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

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

将xml列与架构相关联是否可以提高查询性能?

我们对xml列的使用如下:

答:>在PER客户的基础上,我们可以定义其数据的灵活存储,而无需检查数据库。

B.>我们需要为每个返回客户数据的客户建立报表视图,就好像它是一个简单的表一样(对于Crystal报表或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)
Run Code Online (Sandbox Code Playgroud)

有更快的方法吗?该查询在具有100万条记录的表中为我们运行的很慢,但是当前只有800条具有xml数据!

谢谢

皮特

Rem*_*anu 5

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

使用类型化或未类型化的XML?

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

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

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

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

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

类型化的XML列,参数和变量可以存储XML文档或内容,在声明时必须将其指定为标志(分别为DOCUMENT或CONTENT)。此外,您必须提供一个或多个XML模式。如果每个XML实例只有一个顶级元素,则指定DOCUMENT;否则,请使用CONTENT。查询编译器在查询编译期间的类型检查中使用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>具有value的某些属性的元素"novel"