【问题标题】:Which inserts faster, XML field or Varchar(max) field?哪个插入更快,XML 字段或 Varchar(max) 字段?
【发布时间】:2011-02-16 11:08:56
【问题描述】:

我们有一个存储 xml Web 服务请求和响应的历史记录表。目前它将它们存储到一个 XML 字段中,但是我们在插入时遇到了性能问题。我们只插入记录,没有更新、选择或删除。我们已经截断了表并重建了索引,但无济于事。该表在标识字段上有一个主聚集索引,在日期时间字段上有一个默认值 GetDate()。我们正在运行 SQL 2005 Server,但数据库处于 SQL 2000 兼容模式。

如果我们将字段类型从 XML 更改为 VarChar(max) 或 VarChar(xxx),这会加快插入速度吗?还有什么我们应该看的吗?

谢谢。

【问题讨论】:

  • 我什至不知道您可以在 SQL Server 2000 兼容模式下的数据库中使用 XML 数据类型?

标签: sql-server xml sql-server-2005 performance


【解决方案1】:

这取决于性能问题是什么。

  • 如果受 CPU 限制,则 XML 验证可能是一个因素,而 varchar(max) 可能更快。
  • 如果是 IO 绑定,则 XML 压缩存储优于 nvarchar(max) 松散格式,并且您会降低性能。
  • 另一方面,如果问题 XML 片段很小,则 varchar 存储提供了行内存储的机会,并且可能比 XML 更好
  • 另一方面,行内存储会降低叶页的行密度并导致读取性能问题。
  • 如果问题既不是 CPU 也不是 IO,而是锁争用,那么 XML 与 varchar 问题与性能问题是正交的。插入热点页面闩锁争用问题也是如此。同样,日志刷新性能问题也是如此。所有都将表现为“慢插入”(对于慢的一些定义),并且通过用 varchar 替换 XML 不会有丝毫改变。

因此,与所有性能问题一样,建议先测量,然后再切割。推荐的方法是应用经过良好测试和验证的性能调查方法,例如Waits and Queues。猜测不会让你快速到达目的地。

【讨论】:

  • 感谢您的详尽回答!这是我所知道的:不是 CPU,IO 是一个考虑因素,XML 片段很小,没有读取所以没有读取问题,没有锁定,闩锁争用,没有日志刷新问题。幸运的是,这是一个“值得拥有”的日志,因此我们禁用了它,并将在 QA 中离线处理我们可以监控和测试的问题。
  • 也可能取决于使用情况。为什么要存储 XML 数据(而不是说 - 将其解析为对象并存储在常规表中?)。你是要在数据库中读/写同一行很多还是每年只写一次?通常最好从两者开始,并通过测试不同的场景来衡量哪个更快。
【解决方案2】:

varchar 更快 - 不需要解析。 XML 数据类型做了一些相当繁重的内部工作。

【讨论】:

  • 另一方面,将 XML 文档存储在 XML 列中会产生更少的空间使用 - XML 针对存储进行了优化。
  • 不过,这不是问题 ;)
猜你喜欢
  • 2011-09-15
  • 2015-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
  • 2023-03-14
  • 2014-07-10
相关资源
最近更新 更多