使用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数据!
由于
皮特
答案 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