Syl*_*via 4 xml sql-server-2008
这很疯狂,但在我的xml字段中添加主XML索引后,查询性能大约是50%WORSE.
这就是我正在做的事情.
我有一个包含XML字段ActivityStepLog的表(包含LogData,XML)
我通过运行以下内容生成要插入此表的示例数据
INSERT INTO dbo.ActivityStepLog(
LogGUID
,LogContextID
,LogTypeID
,LogSourceName
,LogContent
,LogDate
,CreateDate
,CreatedBy
)
选择
LogGUID = newid()
,LogContextID = newid()
,LogTypeID = 2
,LogSourceName ='test test test'
,LogContent =( SELECT top 1*FROM ## SampleData SampleData1其中DecisionLogID = SampleData.DecisionLogID FOR XML AUTO,ELEMENTS,ROOT('BusinessRule'))
,LogDate = current_timestamp
,CreateDate = current_timestamp
,CreatedBy ='test create by'from
## SampleData SampleData
SampleData有100,000行,我循环运行5次,最后得到500,000行.
LogContent字段最终将具有以下数据:
-2147483643 0569281A-D1A3-49E3-9E68-BCAC62E2C1C3 1016 2 0 -2147483495 1 2009-05-18T11:47:00 none
(对不起,不确定这是否格式正确 - 它基本上只是一小部分元素).
然后我只是运行一个非常简单的SQL -
SELECT *
FROM ActivityStepLog
WHERE LogContent.value('(/BusinessRuleDecisionLog/SampleData1/DecisionLogID)[1]', 'int') = -2147483535
Run Code Online (Sandbox Code Playgroud)
在LogContent上创建主xml索引之前,需要8秒,之后大约需要12秒.我已经清理了缓存等(DROPCLEANBUFFERS和FREEPROCCACHE),它似乎并没有影响比例,尽管它确实会影响整体时间.
这是我的统计数据:
WITH xml index表'xml_index_nodes_325576198_256000'.扫描计数1000000,逻辑读取3517272,物理读取0,预读读取0,lob逻辑读取0,lob物理读取0,lob预读读取0.表'ActivityStepLog'.扫描计数1,逻辑读取71694,物理读取0,预读取读取0,lob逻辑读取0,lob物理读取0,lob预读读取0.
使用OUT xml索引
(5行受影响)表'ActivityStepLog'.扫描计数1,逻辑读取71694,物理读取0,预读取读取0,lob逻辑读取0,lob物理读取0,lob预读读取0.
因此,对于xml索引,逻辑读取要少得多.我尝试添加所有可用的二级索引,这些索引没有提高主要xml索引的性能.
我将对此进行更多研究,但我真的很感激任何指针或评论.
谢谢,西尔维娅
通过对此进行更多研究 - 对于UNTYPED xml字段来说,至少在我的测试用例中,xml索引会降低性能.这对于类型化的xml似乎有所不同,尽管我没有多看.
DID提高性能的一件事(感谢你在msdn sql xml论坛上wBob的想法!)是在xml字段上创建一个全文索引.那时我得到了亚秒级的表现.我还包括一个xml过滤器以及准确性.
SELECT *
FROM dbo.ActivityStepLog
WHERE
CONTAINS (LogContent, '-2147483535')
and LogContent.value('(/BusinessRuleDecisionLog/SampleData1/DecisionLogID)[1]', 'int') = -2147483535
Run Code Online (Sandbox Code Playgroud)
我需要研究这是否符合我所有的过滤需求,但到目前为止看起来还不错.
西尔维亚