2010-08-20 78 views
2

使用Sql服务器Xml列以确保快速性能和易于报告的最佳做法是什么?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数据!

感谢

皮特

+0

绝对创建一个XML索引! – 2010-08-20 21:42:28

回答

4

XML Best Practices for Microsoft SQL Server 2005

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

哇一个真正彻底的答案在这一个remus谢谢你。这绝对是给我思考的食物和大量的关键字和搜索条件,以进一步我的研究。 – Peter 2010-08-21 03:42:28

2

如果在上面的例子中,你正在使用的XML存储各种字符串列,我不认为你会真的从类型化XML中受益,除非你有一个需要对服务器进行验证数据。在性能方面,我怀疑它会更快无类型化。

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

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

+0

再次感谢信息蓝色和链接+1。 – Peter 2010-08-21 03:41:24