【问题标题】:Reorganize table after converting from TEXT to VARCHAR(MAX)从 TEXT 转换为 VARCHAR(MAX) 后重新组织表
【发布时间】:2017-05-10 14:03:01
【问题描述】:

我有一个带有TEXT 列的大表。我使用以下语句将该列更改为 VARCHAR(MAX)

ALTER TABLE MyTable
ALTER COLUMN Details VARCHAR(MAX)

我了解到TEXT 和新的等效VARCHAR(MAX) 之间的区别在于,少于 8k 字符的记录在内部存储为纯文本而不是 BLOB。

运行上面的语句不到一秒钟,所以我假设没有进行任何重组。 我想知道是否有任何存储过程或类似的东西可以这样做?

由于我的表中只有不到 2% 的记录有超过 8k 的字符,我想知道如果 SQL Server 会改变它存储数据的方式,我是否可以在选择详细信息列时获得性能提升?!

【问题讨论】:

  • 这样的改变不会进行重组。如果您更改数据类型并导致页面拆分,除非您明确发出重组命令,否则 SQL Server 不会为您清理它
  • 谢谢。除了用于索引和统计的命令之外,找不到任何重组命令。有什么提示吗?
  • 重建/重组表(如果它是堆)或重建/重组聚集索引
  • @dfundako 像这样改变不会导致任何页面拆分,它甚至不会触及数据页面;此操作仅是元数据,现有行中没有任何更改,您可以使用 dbcc ind + dbcc page 轻松检查它
  • @dfundako >>>要么重建/重组表(如果它是堆)或重建/重组聚集索引??? 1)如何重组堆? 2) 重建包含 LOB 值的聚簇表,其中文本类型已更改为 varchar(max) 不会导致 LOB 值在行中移动

标签: sql-server performance alter-table varcharmax sql-types


【解决方案1】:

在您更新现有行之前,实际存储不会改变。 我现在找不到任何证明链接,但它的工作方式类似于 text_in_row 选项。当您有一个带有文本列的表格并决定更改表格选项“行中的文本”(因此短字符串可以存储在行中)时,在您更新现有行之前不会进行任何更改

【讨论】:

  • 所以你会推荐这样的东西吗? UPDATE MyTable SET Details = Details 或者是否有某种REORGANIZE 命令用于索引和统计?
  • Niether 重建或重组将限制 LOB 值在行中移动,唯一可以做到的是更新。因此,如果这对您来说真的很重要,您将执行此更新,否则保持原样,如果可以的话,新行将适合行
猜你喜欢
  • 2011-08-14
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
  • 2018-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多