小编Reb*_*cca的帖子

批量更改表添加列,但使用 NEWSEQUENTIALID()

我有一个很大的表,但不是很大(在老化的硬件上少于 200 万行),并且当向现有表添加不可空列时,我通常遵循此处列出的结构,以避免脚本超时的问题我们的数据库迁移在部署上运行(仅供参考 - 这不是全文索引问题)。

所以,总而言之,我:

  • 更改表并将列添加为 NULL 并且不添加默认约束
  • 批量回填柱
  • 更改表并将列更改为 NOT NULL 并添加默认约束

但是,在以下情况下,我想添加一个新的 UNIQUEIDENTIFER 列并用 NEWSEQUENTIALID() 而不是 NEWID() 值填充它。

如果不批量运行,我的脚本将如下所示:

IF NOT EXISTS (
    SELECT NULL FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = 'Invoice' 
    AND COLUMN_NAME = 'InternalId')
BEGIN
    ALTER TABLE Invoice 
        ADD InternalId UNIQUEIDENTIFIER NOT NULL 
        CONSTRAINT [DF_Invoice_InternalId] DEFAULT (NEWSEQUENTIALID())
END
GO
Run Code Online (Sandbox Code Playgroud)

但是,如果我将其分成批次,并尝试使用以下内容填充可为空的 InternalId:

IF NOT EXISTS (
    SELECT NULL FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = 'Invoice' 
    AND COLUMN_NAME = 'InternalId')
BEGIN
    ALTER TABLE Invoice 
        ADD InternalId UNIQUEIDENTIFIER …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2008-r2

7
推荐指数
1
解决办法
1591
查看次数

sp_indexoption 是否会导致索引重建?

我想打开AllowRowLocks=ON多个索引。其中一些索引位于大表上,我真的不想重建或重新组织索引。

MSDN文章中不清楚是否会重建索引。

作为此问题的次要相关部分,MSDN 文章指出正在逐步淘汰 this 的使用,不应再使用:

此功能将在 Microsoft SQL Server 的下一版本中删除。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。而是使用 ALTER INDEX (Transact-SQL)。

看着ALTER INDEX,您似乎被迫重建或重组。我理解正确吗?通过ALTER INDEX我可以重置这个行锁定选项吗?

index sql-server index-tuning sql-server-2012

3
推荐指数
1
解决办法
143
查看次数