这个我主要是对它的三种辅助索引有点迷惑,不过仔细地读了几遍sql联机丛书之后,我基本上明白了吧!在这里做个简单的记述,如果以后还晕的时候,看看就应该能明白过来了。
sql server的xml索引分为四种,主索引,还有三种辅助索引,path index, value index, property index。
先说下主索引,用句联机丛书上的话来说:主 XML 索引是 xml 数据类型列中的 XML BLOB 的已拆分和持久的表示形式。之所以有了主索引以后会提高查询速度,我的理解是,是因为它已经对存储的xml blob进行了事先的拆分并存在了索引中,这样在查询的时候就不需要再为拆分blob进行消耗,但是它又不能提供最优的查询性能是因为它是按照xml原文档的节点顺序进行查找的,并不是按照需要查询值的一个顺序来找的。关于更多关于主索引的具体描述参看sql联机丛书的“主 XML 索引 ”吧:ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.zh-CHS/s10de_1devconc/html/fea9910c-877f-4003-8b80-056451191a4e.htm
或英文的MSDN网址:Primary XML Index
接下来说说三种辅助索引:
path index它是以节点(元素和属性)的路径和其值为键值的索引,所以它适合确切路径已知,或确切路径和其节点值已经知的查询,如(以下的例子都转自联机丛书):
- de>/root/Locationde>,仅指定一个路径
或
- de>/root/Location/@LocationID[.="10"]de>,其中路径和节点值均指定。
WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS "PD")value index,这个跟path index正相反,它是以节点值 节点路径(注意跟path index的顺序是相反的)为键值的索引,所以它适合进行知道确切值但路径模糊的情况,比如路径中有通配符等等:
SELECT CatalogDescription.query('
/PD:ProductDescription/PD:Summary
') AS Result
FROM Production.ProductModel
WHERE CatalogDescription.exist ('/PD:ProductDescription/@ProductModelID[.="19"]') = 1
- de>//author[LastName="someName"]de>,其中 <de>LastNamede>> 元素的值已知,但是 <de>authorde>> 父级可以出现在任何地方。
- de>/book[@* = "someValue"]de>,其中查询将查找包含值为 de>"someValue"de> 的属性的 <de>bookde>> 元素。
WITH XMLNAMESPACES (
'http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo' AS CI,
'http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes' AS ACT)
SELECT ContactID
FROM Person.Contact
WHERE AdditionalContactInfo.exist('//ACT:telephoneNumber/ACT:number[.="111-111-1111"]') = 1
最后就是property index,这个是让我最感到有些迷惑的,先开始看的书上我觉得就没讲明白,后来看了好几遍sql联机丛书,才理解过来。这个猛一看跟path index差不多,但它们两者不一样的地方在于,property index 基于主表的主键,节点的路径和节点值来创建的,它多了一个主表的主键值,path index是不含有主表的主键的,所以它的首要排序是主表主键,而path index则是纯粹以路径为首要排序,根本没有主键的事,所以path index适合来搜索路径,而关于property index并不适合像path index那样来搜索路径,因为这个索引是根据主表主键先进行了聚合或者说它是先按着主表主键的顺序来排的,所以 sql 联机丛书才这样写:
从单个 XML 实例检索一个或多个值的查询适用 PROPERTY 索引。当使用 xml 类型的 value() 方法检索对象属性并且知道对象的主键值时,会发生这种情况。
注意并且知道对像的主键值这几个字。反正我是这样理解的。具体的例子如:
WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS "PD")关于辅助索引具体的可以参见sql联机丛书:ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.zh-CHS /s10de_1devconc/html/a90ee318-231e-4ca6-be4e-dc73c80386ba.htm或英文的msdn: Secondary XML Indexes
SELECT CatalogDescription.value('(/PD:ProductDescription/@ProductModelID)[1]', 'int') as ModelID,
CatalogDescription.value('(/PD:ProductDescription/@ProductModelName)[1]', 'varchar(30)') as ModelName
FROM Production.ProductModel
WHERE ProductModelID = 19
最后再转两句sql联机丛书关于xml索引使用原则的话:
- 对 XML 列进行查询在您的工作负荷中很常见。必须考虑数据修改过程中的 XML 索引维护开销。
- XML 值相对较大,而检索的部分相对较小。生成索引避免了在运行时分析所有数据,并能实现高效的查询处理,从而使索引查找受益。