依赖关系大小数据库和更改表

时间:2014-05-27 13:43:22

标签: sql sql-server

是数据库大小与下面命令的速度之间的连接 完成依赖于列中的数据? “它”是否必须检查是否可以根据条目更改数据类型?对于需要的125万条记录 15分钟。

代码:

USE RDW_DB
GO
ALTER TABLE dbo.RDWTabel
    ALTER COLUMN Aantalcilinders SmallInt

2 个答案:

答案 0 :(得分:7)

所有ALTER COLUMN操作都实现为添加新列并删除旧列:

  • 添加新类型的新列
  • 运行内部UPDATE <table> SET <newcolumn> = CAST(<oldcolumn> as <newtype>);
  • 将旧列标记为已删除

您可以在ALTER COLUMN之后检查表结构,并查看所有已删除的隐藏列。见SQL Server table columns under the hood

如您所见,这会导致数据大小更新,必须触及每一行以填充新列的值。这需要在一张大桌子上自己花费时间,但通常的问题是日志增长。由于操作必须在单个事务中完成,因此日志必须增长以适应此更改。在进行此类更改时,newbs通常会耗尽磁盘空间。

某些操作可以完成&#39; inline&#39;。如果新类型适合为旧类型保留的空间并且磁盘布局兼容,则不需要更新:新列实际上覆盖在旧列数据之上。上面链接的文章就是这个例子。此外,对于更改长度的可变长度类型的操作通常不需要更改磁盘上的数据并且速度更快。

此外,任何ALTER操作都需要对表进行独占架构修改锁定。这将阻止,等待任何当前活动(查询)流失。通常,感知持续时间的时间是由于锁定等待而不是执行。请阅读How to analyse SQL Server performance了解详情。

最后,一些ALTER COLUMN操作不需要修改现有数据,但确实需要验证现有数据,以确保它符合新类型的要求。他们将运行一个SELECT(它们将扫描数据),而不是运行UPDATE,它仍然是数据大小,但至少不会生成任何日志。

在您的情况下,ALTER COLUMN Aantalcilinders SmallInt无法判断操作是否为数据大小。这取决于之前的Aantalcilinders类型。如果新类型的大小增加,那么它需要更新数据大小。例如。如果前一个类型是tinyint,则ALTER COLUMN必须更新每一行。

答案 1 :(得分:1)

更改列的类型时,通常需要重写数据。例如,如果数据最初是一个整数,那么在此操作之后每个记录将缩短两个字节。这会影响页面上记录的布局以及页面的分配。每个页面都需要触及。

我相信SQL Server中有一些操作可以在不影响布局的列上执行。其中一个是将列从可空变为不可空,因为无论可空性如何,都会为每个列存储空标志。