[英]performance on xml column in sql server
我有规范化的表,这些表将数据保留为以下格式。
第一表名称LogBook列是JourneyID,LocationID,PositionID,ID,
第二个表LogBookEvents列是LogBookID,LifeCodeID,LifeCode,LifeCodeValue,TotalValue
第一个表具有340万条记录,第二个表具有1730万条记录。
我发现即使我在表上拥有所有必需的索引,这些表的性能也非常沉重。
因此,我设计了一个具有XML格式的新表
新表是.. LogbookLifeCodes,列是JourneyID,LifeCode(XML类型)
通过这样做,我将记录数减少到900,000
并且LifeCode以以下格式保存数据
<LogBookLifeCodeEvents><LifeCodes>
<LogBookID>11</LogBookID>
<LocationID>0</LocationID>
<PositionID>0</PositionID>
<LifeCodeID>4</LifeCodeID>
<LifeCode>FH</LifeCode>
<LifeValue>0.0000</LifeValue>
<LifeTotal>0.0000</LifeTotal>
现在正在使用以下查询以表格式返回数据。
Select Tbl.Col.value('LogBookID[1]', 'int'),
Tbl.Col.value('LocationID[1]', 'int'),
Tbl.Col.value('LocationPositionID[1]', 'int'),
Tbl.Col.value('LifeCodeID[1]', 'int'),
Tbl.Col.value('LifeCode[1]', 'varchar(20)') from LogbookLifeCodes outer apply LogbookLifeCodes.LifeCode.nodes('//LogBookLifeCodeEvents/LifeCodes') Tbl(Col) where Tbl.Col.value('LogBookID[1]', 'int') = 11
但是,此查询需要4分钟才能运行,以获取LogBookID = 11的值,这是不可接受的,返回130,000条记录。
但是如果我查询以上规范化的表只需要01秒,记录数就会相同
第二个表上的XML列具有主索引和辅助索引。
当我检查执行计划时,标准化表索引(聚集)的成本为73%
但在XML列索引上仅花费45%
只是想知道,使用XML列而不是使用关系表更好? 还是因为第二个表的记录少于第一个结构,所以有什么其他方法可以提高XML列的性能?
感谢您的赞美和建议
非常感谢
参考本文( 在SQL Server中使用XML数据的性能提示 ),请注意以下三个提示:
您可能正在为XML编制索引,但是(对我而言)为XML编制索引比根据查询计划为关系数据编制索引更加困难。 本文的重点是,如果您确实非常努力地工作,则可以使用XML数据达到性能的相关级别,而不是超过它。
我理解为什么您可能会在概念上采用这种方式,但是SQL Server是一个关系数据库。 通过适当管理的关系对象,您几乎总是会获得最佳性能。
您注意到,“即使我在表上拥有所有必要的索引,我也发现这些表的性能非常沉重”,但后来指出note的关系查询仅需1秒,而基于XML的查询则需4分钟。
根据提供的信息,我不了解您要解决的问题,但是您不应该期望XML数据比SQL Server中的关系数据具有更好的性能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.