繁体   English   中英

SQL Server的xml列上的性能

[英]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数据的性能提示 ),请注意以下三个提示:

  1. 通过使用持久化列提升为关系列。
  2. 键入数据。
  3. 索引XML。

您可能正在为XML编制索引,但是(对我而言)为XML编制索引比根据查询计划为关系数据编制索引更加困难。 本文的重点是,如果您确实非常努力地工作,则可以使用XML数据达到性能的相关级别,而不是超过它。

我理解为什么您可能会在概念上采用这种方式,但是SQL Server是一个关系数据库。 通过适当管理的关系对象,您几乎总是会获得最佳性能。

您注意到,“即使我在表上拥有所有必要的索引,我也发现这些表的性能非常沉重”,但后来指出note的关系查询仅需1秒,而基于XML的查询则需4分钟。

根据提供的信息,我不了解您要解决的问题,但是您不应该期望XML数据比SQL Server中的关系数据具有更好的性能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM