真是令人惊讶,但在我将一个主 XML 索引添加到我的 xml 字段后,查询性能竟然降低了约 50%。
这是我的操作步骤:
我有一个包含 XML 字段 ActivityStepLog 的表(包含 LogData, XML)。
我通过运行以下命令生成示例数据以插入该表中:
INSERT INTO dbo.ActivityStepLog (
LogGUID
,LogContextID
,LogTypeID
,LogSourceName
,LogContent
,LogDate
,CreateDate
,CreatedBy
)
select
LogGUID = newid()
,LogContextID = newid()
,LogTypeID = 2
,LogSourceName = 'test test test'
,LogContent = (SELECT top 1 * FROM ##SampleData SampleData1 where 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
在 LogContent 上创建主 XML 索引之前,需要 8 秒,之后大约需要 12 秒。我清除了缓存等(DROPCLEANBUFFERS 和 FREEPROCCACHE),虽然它确实影响了总时间,但似乎不影响比例。
以下是我的统计数据:
使用 XML 索引 表 '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。
不使用 XML 索引
(5 行受影响) 表 'ActivityStepLog'。扫描次数 1,逻辑读取数 71694,物理读取数 0,预读取数 0,LOB 逻辑读取数 0,LOB 物理读取数 0,LOB 预读取数 0。
因此,没有使用 XML 索引时逻辑读取量要少得多。我尝试添加所有可用的二级索引,但与具有主 XML 索引相比,性能并没有提高。
我将继续研究此问题,但我真的很感谢任何指针或评论。
谢谢, Sylvia