SQL Server 2008 - 为什么性能WORSE与xml索引?

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索引的性能.

我将对此进行更多研究,但我真的很感激任何指针或评论.

谢谢,西尔维娅

Syl*_*via 5

通过对此进行更多研究 - 对于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)

我需要研究这是否符合我所有的过滤需求,但到目前为止看起来还不错.

西尔维亚