如何重写SQLXPath查询以创建索引视图

如何重写SQLXPath查询以创建索引视图,sql,sql-server-2008,xpath,view,indexing,Sql,Sql Server 2008,Xpath,View,Indexing,我有一个视图,可以从包含xml数据的表中提取一些信息。 每个文档包含一个产品和多个PurchaseOrderDetail。我想为每个产品创建一个包含所有PurchaseOrderDetail的视图 有效负载列包含XML数据 这个视图的问题是速度非常慢,因为XML文档既大又丰富 我想为这个视图编制索引,但这会给我带来错误 无法在视图XmlLoad.dbo.XML_PurchaseOrders上创建索引,因为它包含APPLY。考虑不要对视图进行索引,或者删除应用程序。 是否可以重写视图以添加索引 我

我有一个视图,可以从包含xml数据的表中提取一些信息。 每个文档包含一个产品和多个PurchaseOrderDetail。我想为每个产品创建一个包含所有PurchaseOrderDetail的视图

有效负载列包含XML数据

这个视图的问题是速度非常慢,因为XML文档既大又丰富

我想为这个视图编制索引,但这会给我带来错误

无法在视图XmlLoad.dbo.XML_PurchaseOrders上创建索引,因为它包含APPLY。考虑不要对视图进行索引,或者删除应用程序。 是否可以重写视图以添加索引


我试过几次,主要是选择。。。从选择。。。。InnerSelect group by foo,但是所有的都依赖于一个或另一个关于视图索引的规则。

您尝试过XML索引吗

不,我不这么认为。相反,我将使用问题中的一些信息,并提出另一种方法

您可以将计算出的持久化列添加到表中,该表只保存具有id的XML。不允许在计算列中直接使用XQUERY,但可以使用用户定义的函数

以下是函数:

create function dbo.GetPurchaseOrderID(@XMLData xml) 
returns xml with schemabinding
as
begin
  return @XMLData.query('declare namespace NS="http://schemas.datacontract.org/2004/07/XmlDbPerfTest"; 
    /NS:ProductAndRelated/NS:Product/NS:PurchaseOrderDetails/NS:PurchaseOrderDetail/NS:PurchaseOrderID')
end 
使用持久化XML列创建表:

CREATE TABLE [dbo].[XmlLoadData](
    [ProductID] [int] NOT NULL identity,
    [PayLoad] [xml] NOT NULL,
    [Size]  AS (len(CONVERT([nvarchar](max),[PayLoad],0))),
    [PurchaseOrderIDs] AS dbo.GetPurchaseOrderID(PayLoad) PERSISTED,
 CONSTRAINT [PK_XmlLoadData] PRIMARY KEY CLUSTERED 
(
    [ProductID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, 
       IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, 
       ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
查询以获取ID:

;with xmlnamespaces('http://schemas.datacontract.org/2004/07/XmlDbPerfTest' as NS)
select ProductID,
       P.N.value('.', 'int') as PurchaseOrderID
from XmlLoadData
  cross apply PurchaseOrderIDs.nodes('NS:PurchaseOrderID') as P(N)

对我来说,有限的测试表明它要快一点。如果您的XML文档很大,那么应该有更大的改进。我怀疑它会将性能提高1000倍,因为您仍在处理XML解释,但您告诉我。如果没有您的数据,我当然无法进行测试。

XML索引不是一个选项。它至少增加了10GB的数据库大小,我们经常通过网络处理数据库副本。我只想索引XML数据中的一小部分内容。xml文档又大又多,我还尝试在较小的数据子集上使用xml索引,但改进仅为2倍左右。我需要1000倍左右。因为您需要使用XML中的多个节点,所以我不知道如何在不交叉应用的情况下执行此操作,因此我不知道如何在这样一个视图中执行此操作,以便在其上创建索引视图:-@marc_s,我也不知道,但我希望有其他方法来扩展我不知道的XML。我假设没有一个选项可以从XML中提取这些数据并存储在关系表中?@billinkc,这就是我目前正在做的。但是最好有一个索引视图,以避免维护其他表,并确保关系表不会与主表不同步。这听起来很有趣。我想我可以使用一个函数来构建一个精简版的XML,其中只包含视图所需的数据。在现实生活中,我有多个数据项。然后我可以从最小的XML创建视图。
CREATE TABLE [dbo].[XmlLoadData](
    [ProductID] [int] NOT NULL identity,
    [PayLoad] [xml] NOT NULL,
    [Size]  AS (len(CONVERT([nvarchar](max),[PayLoad],0))),
    [PurchaseOrderIDs] AS dbo.GetPurchaseOrderID(PayLoad) PERSISTED,
 CONSTRAINT [PK_XmlLoadData] PRIMARY KEY CLUSTERED 
(
    [ProductID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, 
       IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, 
       ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
;with xmlnamespaces('http://schemas.datacontract.org/2004/07/XmlDbPerfTest' as NS)
select ProductID,
       P.N.value('.', 'int') as PurchaseOrderID
from XmlLoadData
  cross apply PurchaseOrderIDs.nodes('NS:PurchaseOrderID') as P(N)