2010-11-09 65 views
4

这很疯狂,但是在向我的xml字段添加主XML索引后,查询性能大约为50%。SQL Server 2008 - 为什么性能WORSE与XML索引?

这是我正在做的。

  • 我有包含XML字段ActivityStepLog的表(包含LogData,XML)

  • 我生成的采样数据通过运行下面的

    INSERT INTO dbo.ActivityStepLog将插入此表(
    LogGUID
    ,LogContextID
    ,LogTypeID
    ,LogSourceName
    ,LogContent
    ,LOGDATE
    ,CREATEDATE
    ,CreatedBy

    选择
    LogGUID = NEWID()
    ,LogContextID = newid的()
    ,LogTypeID = 2
    ,LogSourceName =“测试测试测试”
    ,LogContent =(SELECT顶部1 * FROM ##的sampleData SampleData1其中DecisionLogID = SampleData.DecisionLogID FOR XML AUTO,ELEMENTS,ROOT( 'BusinessRule'))
    ,LOGDATE = CURRENT_TIMESTAMP
    ,CREATEDATE = CURRENT_TIMESTAMP
    ,CreatedBy =
    从##的sampleData的sampleData '测试通过创建'

的sampleData具有100,000行,我运行它在一个循环5次,用500000最终行。

  • 的LogContent字段最终将具有诸如以下数据:

    -2147483643 0569281A-D1A3-49E3-9E68-BCAC62E2C1C3 -2147483495 2009-05-18T11:47:00 none

(抱歉,不知道这是否将被正确格式化 - 它基本上只是一小组元素)。

然后,我只是运行一个非常简单的SQL -

SELECT * 
FROM ActivityStepLog 
WHERE LogContent.value('(/BusinessRuleDecisionLog/SampleData1/DecisionLogID)[1]', 'int') = -2147483535 

上LogContent创建主XML索引之前,它需要8秒,之后,大约需要12秒。我已经清除了缓存等(DROPCLEANBUFFERS和FREEPROCCACHE),虽然它影响整体时间,但似乎并未影响比例。

这里是我的统计数据:

使用XML索引表 'xml_index_nodes_325576198_256000'

。扫描计数百万,逻辑读取3517272,物理读取0,预读0,lob逻辑读取0,lob物理读取0次,lob预读0 表“ActivityStepLog”。扫描计数1,逻辑读取71694,物理读取0,预读0,lob逻辑读取0,lob物理读取0次,lob预读0

随着OUT XML索引

(5行(s)affected) Table'ActivityStepLog'。扫描计数1,逻辑读取71694,物理读取0,预读读取0,lob逻辑读取0,lob物理读取0,lob预读读取0.

因此,逻辑读取少得多,指数。我尝试添加所有可用的二级索引,但这并没有改善性能,而是具有主要的xml索引。

我会做一些这方面的更多的研究,但我真的很感激任何指针或意见。

感谢, 西尔维亚

+1

因为你需要在除了主要的一个辅助指标 - 为路径IIRC – 2010-11-09 00:32:06

+0

感谢您的评论,但正如我在文章中提到,我并添加所有可用的辅助XML索引,但没有没有看到任何性能提升。 – Sylvia 2010-11-09 03:58:14

回答

5

从这做更多的研究 - 看来,对于非类型化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 

我门坎需要研究这是否适合我所有的过滤需求,但到目前为止,它看起来不错。

西尔维亚