Sql Server Xml列最佳实践

时间:2010-08-20 21:39:08

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

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

如何设置列? 你把它作为无类型的吗? 或者将它与模式相关联?

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

我们对xml列的使用如下:

A.>在PER客户的基础上,我们可以定义其数据的灵活存储,而无需对数据库进行检修。

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

由于

皮特

2 个答案:

答案 0 :(得分:5)

来自XML Best Practices for Microsoft SQL Server 2005

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

  

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

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

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

     

使用键入的 XML数据类型   以下条件:

     
      
  • 你有XML数据的模式,你想要服务器   根据确认您的XML数据   XML模式。
  •   
  • 您希望利用基于存储和查询的优化   关于类型信息。
  •   
  • 您希望在此过程中更好地利用类型信息   汇编您的查询,例如   静态类型错误。
  •   
     

键入的XML列,参数和   变量可以存储XML文档或   内容,您必须指定为   国旗(文件或内容,   分别)在时间   宣言。此外,你必须   提供一个或多个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>个元素,其中某些属性的值为"novel"
  •   

答案 1 :(得分:2)

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

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

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