ElH*_*aix 7 performance database-design varchar sql-server-2008-r2 type-conversion
我知道在向大表中添加新字段时,建议将它们添加到字段的末尾而不是中间的某个位置,并且想知道在更改字段类型时是否适用这样的事情?
我有一个包含大约一百万条记录的表,其中包含几个 VARCHAR 类型的字段。我想将这些更改为 NVARCHAR,但据我所知,这将需要一些时间和资源,因为字段位于表的中间,并且 SQL Server 必须进行大量复制/重新排序。
实现这一目标的有效方法是什么?
Aar*_*and 20
一种方法可能是:
从长远来看,这不会更快,并且仍然需要一个维护窗口(因为您不希望用户更新您已经更新的行,除非您放置一个临时触发器来应对),但它会阻止大笔交易,经过几次更新后,您将更可预测需要多长时间。
您可以通过创建一个新表并在完成后重命名来做同样的事情......虽然这避免了第 5 步的需要,但它会导致更多的数据流失,并且由于约束、外键、触发器而可能会出现更多问题等可能与表格有关的内容。
直接回答问题,执行操作有两种方式。
关于大表的注意事项:如果表有几千条或更少的记录,您可以立即进行操作。在百万记录表的情况下,批量执行更实用(假设每次有 1000 条或 100 条记录)。
伪临时列
伪临时列(我忘记是否有另一个更合适的名称)是用于存储转换结果的列。在这种情况下,它们也将是该过程之后的最终列。
这与Aaron 的回答中详述的过程相同。
伪临时表
当修改在多个列中时,基于旧表的架构创建一个新表更实用。
第 4 步注意事项:如果您检测到任何重复索引(检测重复索引是一个很长的主题,请参阅 SQLSkills.com 上的 Kimberly Tripp 博客),如果是这种情况,您就有机会摆脱它们。
性能影响
从 VARCHAR 更改为 NVARCHAR 对性能有一些影响,至少对于低于 2008R2 的任何 SQL Server。对于 SQL 2008 R2,Aaron Bertrand 有一些关于 Unicode 压缩功能的博客文章 - 当使用 NVarchar 列存储可以存储在 VARCHAR 列上的内容时,这可以抵消平衡。我没有像文章应得的那样完整地阅读它们,但是这个主题很有趣。
NVARCHAR 列通常(IOW,2008R2 之前)将所有字符存储在每个字符 2 个字节的列中。例如,字符串“MSSQL”将在 VARCHAR 列上以 5 个字节存储,在 NVARCHAR 列上以 10 个字节存储。由于非 LOB 字符串列被限制为最多存储 8000个字节,这意味着 VARCHAR 可以存储 8000 个字符,而 NVARCHR 限制为 4000 个。
这些事实的含义:
编辑:正如 gbn 所说,当您有明确的要求需要填充 NVARCHAR 列时,不值得仅仅为了使用 VARCHAR 而创建一些东西。