Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 依赖项大小数据库和Alter表_Sql_Sql Server - Fatal编程技术网

Sql 依赖项大小数据库和Alter表

Sql 依赖项大小数据库和Alter表,sql,sql-server,Sql,Sql Server,是数据库大小与执行以下命令的速度之间的关系 是否根据列中的数据完成?“It”是否必须检查是否可以根据条目更改数据类型?对于1250万条记录,大约需要 15分钟 代码: 更改列的类型时,通常需要重写数据。例如,如果数据最初是一个整数,那么在此操作之后,每条记录将缩短两个字节。这会影响页面上记录的布局以及页面的分配。每一页都需要触摸 我相信在SQL Server中,您可以对列执行一些操作,这些操作不会影响布局。其中之一是将列从可为null更改为不可为null,因为不管是否可为null,都会为每个列存

是数据库大小与执行以下命令的速度之间的关系 是否根据列中的数据完成?“It”是否必须检查是否可以根据条目更改数据类型?对于1250万条记录,大约需要 15分钟

代码:


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


我相信在SQL Server中,您可以对列执行一些操作,这些操作不会影响布局。其中之一是将列从可为null更改为不可为null,因为不管是否可为null,都会为每个列存储null标志。

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


我相信在SQL Server中,您可以对列执行一些操作,这些操作不会影响布局。其中之一是将列从可为null更改为不可为null,因为不管是否可为null,都会为每个列存储null标志。

所有ALTER column操作都是作为添加新列和删除旧列的方式实现的:

  • 添加新类型的新列
  • 运行内部
    更新集=CAST(as)
  • 将旧列标记为已删除
您可以在ALTER列之后检查表结构,并查看所有已删除的隐藏列。看

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

某些操作可以“内联”完成。如果新类型适合为旧类型保留的空间,并且磁盘布局兼容,则不需要更新:新列实际上覆盖在旧列数据的顶部。上面链接的文章就是例证。另外,更改磁盘上的数据通常不需要对更改长度的可变长度类型执行操作,而且速度更快

此外,任何ALTER操作都需要表上的独占模式修改锁。这将阻塞,等待任何当前活动(查询)耗尽。通常,感知的持续时间是由于锁定等待,而不是执行。阅读更多细节

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


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

所有ALTER列操作都作为添加新列和删除旧列的方式执行:

  • 添加新类型的新列
  • 运行内部
    更新集=CAST(as)
  • 将旧列标记为已删除
您可以在ALTER列之后检查表结构,并查看所有已删除的隐藏列。看

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

某些操作可以“内联”完成。如果新类型适合为旧类型保留的空间,并且磁盘布局兼容,则不需要更新:新列实际上覆盖在旧列数据的顶部。上面链接的文章就是例证。另外,更改磁盘上的数据通常不需要对更改长度的可变长度类型执行操作,而且速度更快

此外,任何ALTER操作都需要表上的独占模式修改锁。这将阻塞,等待任何当前活动(查询)耗尽。通常,感知的持续时间是由于锁定等待,而不是执行。阅读更多细节

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

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

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