我们有一个进程,它获取表列的列表和每个应该具有的大小(varchar 类型)并修改它们以确保它具有定义的大小。
在实际实现中我们直接对列表中的每一列执行一个alter table...
如果我们首先检查列大小是否与正确的大小不同,然后才执行更改表,它会运行得更快吗?
据统计,有 4000 左右的表列需要检查,最多 20 列需要更正......
我们有一个进程,它获取表列的列表和每个应该具有的大小(varchar 类型)并修改它们以确保它具有定义的大小。
在实际实现中我们直接对列表中的每一列执行一个alter table...
如果我们首先检查列大小是否与正确的大小不同,然后才执行更改表,它会运行得更快吗?
据统计,有 4000 左右的表列需要检查,最多 20 列需要更正......
编辑:反映评论:
哪个更快取决于修改列的操作成本以及表中需要更改的列的数量。例如,更改一列空值并不是很昂贵。但是,如果您有很多数据,并且表中有很多列,则最好将表复制到新表中。根据您的数据库的指标来决定这一点,并不总是有正确和错误的答案。
您可能会创建一些动态 sql 来创建更改不正确大小的列的长度的 sql。这一定是最快的方法。
就像是:
SELECT
'some decision logic...' -- substitute values as needed
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
ISNULL(CHARACTER_MAXIMUM_LENGTH, 5) <> 5
AND DATA_TYPE = 'NVARCHAR'
您可以添加要考虑的指标、表大小、数据大小列数(分组依据)等。
Sql Server 已经存储了所有这些元数据,您可以查询它。在自定义表中复制此信息并在其上运行光标似乎是错误的。我认为您提到的问题是复制此信息可能会导致数据过时,而 sql server 元数据将始终是最新的。为了更容易,您可以创建元数据视图以使其易于使用。但这是一个不同的问题。
最后,我们在 alter table 之前实施了检查,在需要执行 alter 命令的情况下,进程运行速度明显更快