以下查询需要很长时间才能返回结果。我已经尝试了我能想到的一切来优化查询。使用这种结构存储了大约 10000 行 xml,大约需要 2.5 分钟才能返回结果。我在表上设置了一个主 xml 索引,并在表上设置了一个辅助(属性)索引。我已将索引设置为每 7 天重建一次。
我参考了这些位置
任何意见和建议将不胜感激。
对不起所有的代码,如果不需要,我可以把它拿出来。
我有一张桌子:
CREATE TABLE [dbo].[XmlTable](
[XmlId] [int] IDENTITY(1,1) NOT NULL,
[XmlDocument] [xml] NOT NULL,
CONSTRAINT [PK_XmlTable] PRIMARY KEY CLUSTERED
(
[XmlId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
带有属性二级索引
SET ARITHABORT ON
SET CONCAT_NULL_YIELDS_NULL ON
SET QUOTED_IDENTIFIER ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
SET NUMERIC_ROUNDABORT OFF
GO
CREATE XML INDEX [IXML_XmlTable_XmlDocument_Property] ON [dbo].[XmlTable]
(
[XmlDocument]
)
USING XML INDEX [PXML_XmlTable_XmlDocument] FOR PROPERTY WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
GO
带有主索引
SET ARITHABORT ON
SET CONCAT_NULL_YIELDS_NULL ON
SET QUOTED_IDENTIFIER ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
SET NUMERIC_ROUNDABORT OFF
GO
CREATE PRIMARY XML INDEX [PXML_XmlTable_XmlDocument] ON [dbo].[XmlTable]
(
[XmlDocument]
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
GO
使用这样的结构:
<dev:Doc xmlns:dev="http://www.w3.org/2001/XMLSchema" SchemaVersion="0.1" Settings="Testing" Title="Ordering">
<dev:Base RevisionNumber="0" Baseid="34433" />
<dev:Rev Time="2013-01-21T15:08:00">
<dev:Person Name="Me" Systemid="54654" />
</dev:Rev>
<dev:Functions Id="A1">
<dev:A1 Number="1">
<dev:Codes>D</dev:Codes>
<dev:Required>true</dev:Required>
<dev:Informational>false</dev:Informational>
<dev:Visitors>
<dev:Visitor Name="Dev01" Location="STLRF">
<dev:Divisions>
<dev:Division Number="1" Name="TFR3" Usage="Monitor">
<dev:Description>Development Fundamentals</dev:Description>
</dev:Division>
<dev:Division Number="2" Name="DEF32" Usage="Monitor">
<dev:Description>Testing Fundamentals</dev:Description>
</dev:Division>
<dev:Division Number="3" Name="DEP13" Usage="None">
<dev:Description>Guided Fundamentals</dev:Description>
</dev:Division>
</dev:Divisions>
</dev:Visitor>
<dev:Visitor Name="Dev02" Location="STLRF">
<dev:Divisions>
<dev:Division Number="1" Name="TFR3" Usage="Monitor">
<dev:Description>Development Fundamentals</dev:Description>
</dev:Division>
<dev:Division Number="2" Name="DEF32" Usage="Monitor">
<dev:Description>Testing Fundamentals</dev:Description>
</dev:Division>
<dev:Division Number="3" Name="DEP13" Usage="None">
<dev:Description>Guided Fundamentals</dev:Description>
</dev:Division>
</dev:Divisions>
</dev:Visitor>
<dev:Visitor Name="Dev03" Location="FGRTY">
<dev:Divisions>
<dev:Division Number="1" Name="TFR3" Usage="Monitor">
<dev:Description>Development Fundamentals</dev:Description>
</dev:Division>
<dev:Division Number="2" Name="DEF32" Usage="Monitor">
<dev:Description>Testing Fundamentals</dev:Description>
</dev:Division>
<dev:Division Number="3" Name="DEP13" Usage="None">
<dev:Description>Guided Fundamentals</dev:Description>
</dev:Division>
</dev:Divisions>
</dev:Visitor>
</dev:Visitors>
<dev:Senders>
<dev:Sender Name="FGY(14A)" />
</dev:Senders>
</dev:A1>
</dev:Functions>
<dev:Functions Id="A2">
<dev:A2 Number="1">
<dev:Codes>C</dev:Codes>
<dev:Required>true</dev:Required>
<dev:Informational>false</dev:Informational>
<dev:Remarks>Support</dev:Remarks>
<dev:Notes>Ready</dev:Notes>
<dev:Visitors>
<dev:Visitor Name="GHFF">
<dev:Divisions>
<dev:Division Number="0" Name="Trial" Usage="None">
<dev:FromLocation>LOPO</dev:FromLocation>
<dev:ToLocation>RDSS</dev:ToLocation>
<dev:Description>Rich Filter</dev:Description>
</dev:Division>
</dev:Divisions>
</dev:Visitor>
</dev:Visitors>
<dev:Senders>
<dev:Sender Name="W33R" />
</dev:Senders>
<dev:IsReady>true</dev:IsReady>
<dev:IsCall>false</dev:IsCall>
</dev:A2>
<dev:A2 Number="2">
<dev:Codes>A</dev:Codes>
<dev:Required>true</dev:Required>
<dev:Informational>false</dev:Informational>
<dev:Remarks>Loader Ready</dev:Remarks>
<dev:Notes>Ready</dev:Notes>
<dev:Visitors>
<dev:Visitor Name="UDT">
<dev:Divisions>
<dev:Division Number="0" Name="Trial" Usage="None">
<dev:FromLocation>TYUJ</dev:FromLocation>
<dev:ToLocation>DETF</dev:ToLocation>
<dev:Description>Web Enhance</dev:Description>
</dev:Division>
</dev:Divisions>
</dev:Visitor>
</dev:Visitors>
<dev:Senders>
<dev:Sender Name="RJ4" />
</dev:Senders>
<dev:IsReady>true</dev:IsReady>
<dev:IsCall>false</dev:IsCall>
</dev:A2>
</dev:Functions>
</dev:Doc>
和查询:
;WITH XMLNAMESPACES (Default 'http://www.w3.org/2001/XMLSchema' )
SELECT
a.value('@RevisionNumber[1]', 'INT') AS Number,
b.value('@Id[1]', 'VARCHAR(10)') AS FunctionID,
c.value('@Number[1]', 'INT') AS Number,
d.value('@Name[1]', 'VARCHAR(10)') AS Visitor,
d.value('@Location[1]', 'VARCHAR(10)') AS Location,
e.value('@Name[1]', 'NVARCHAR(10)') AS Sender
From XmlTable as x
CROSS APPLY xmlDocument.nodes('Doc/Base') As aa(a)
CROSS APPLY xmlDocument.nodes('Doc/Functions') bb(b)
CROSS APPLY b.nodes('*') cc(c)
CROSS APPLY c.nodes('Visitors/Visitor') dd(d)
CROSS APPLY c.nodes('Senders/Sender') ee(e)
这是表格中的插入内容,为了测试我运行了 10000 次
INSERT INTO XmlTable(XMLDocument)
SELECT * FROM OPENROWSET(
BULK 'C:\Users\123\Desktop\Practice.xml',
SINGLE_BLOB) AS x;
Go 10000
我最初是这个查询,但它比上面的查询慢 x3
;WITH XMLNAMESPACES (default 'http://www.w3.org/2001/XMLSchema')
SELECT
a.value('(Base/@RevisionNumber)[1]', 'INT') AS RevNumber,
b.value('@Id[1]', 'VARCHAR(10)') AS FunctionID,
c.value('@Number[1]', 'INT') AS Number,
d.value('@Name[1]', 'VARCHAR(10)') AS Visitor,
d.value('@Location[1]', 'VARCHAR(10)') AS Location,
c.value('(Senders/Sender/@Name)[1]', 'VARCHAR(10)') AS Sender
FROM XmlTable
CROSS APPLY xmlDocument.nodes('Doc') As aa(a)
CROSS APPLY a.nodes('Functions') bb(b)
CROSS APPLY b.nodes('*') cc(c)
CROSS APPLY c.nodes('Visitors/Visitor') dd(d)