如何在没有超时的情况下更改大型Azure表

时间:2014-01-17 13:26:51

标签: azure azure-sql-database

我正在尝试更改大型Azure表中的字段定义(20 Gb,500M +记录)

nvarchar(max) nvarchar(16)

ALTER TABLE [dbo].[MyTable] ALTER COLUMN [MyField] [nvarchar](16)

但我找不到执行此命令的方法而不会遇到超时。从Visual Studio和SQL Server Management Studio我得到了

消息10054,级别20,状态0,行0 从服务器接收结果时发生传输级错误。 (提供者:TCP提供者,错误:0 - 强制执行现有连接 由远程主机关闭。)

约30分钟后

几分钟后,当我从Azure管理门户运行命令时,我得到:

消息-2,级别11,状态0,行0 超时已过期。操作完成之前经过的超时时间或服务器没有响应。

如何在SQL Azure上执行如此长时间运行的查询?

6 个答案:

答案 0 :(得分:1)

尝试使用v12" WITH(ONLINE = ON)" alter语句的选项。请参阅此处的示例:

http://sqlperformance.com/2015/02/sql-performance/more-online-operations

答案 1 :(得分:0)

你应该试试

ALTER TABLE [dbo]。[MyTable] ALTER COLUMN [MyField] nvarchar NULL

注意NULL参数......

答案 2 :(得分:0)

不只是改变SQL Azure中大表的列

而是执行以下操作:

  1. 使用所需的架构创建一个新表。
  2. 将原始表中的数据小批量复制到新表中。
  3. 删除原始表格。
  4. 将新表重命名为原始表。

答案 3 :(得分:0)

实际上有一个选项 - 将您的数据库扩展到更高性能的层,执行繁重的工作并将其扩展回来。

我有S2数据库,试图改变海量表,30分钟后超时。所以我把它扩展到P2,在6分钟内完成。缩小规模 - 您需要支付1小时的P2费用,目前为1欧元。 Peronally,我会随时给1 EURo以避免像创建新表这样的脏东西,移动数据维护实时系统的一致性,重命名表等......

答案 4 :(得分:0)

通常你会在V11中看到这一点,升级到V12不应该有会话限制限制的问题。另一个想法是添加一个空列/默认值并逐步填充该值并在需要时翻转该位,直到那时您的应用程序应该忽略该列。

答案 5 :(得分:0)

你能否添加一个允许为null的新列,将旧列数据复制到其中,将可空性更改为不允许为null,删除原始列,然后将新列重命名为旧列?

复制到新列可能需要一些时间,但它不应该使表离线,我不认为列删除或重命名会花费很多时间。像这样:

ALTER TABLE dbo.Table_1 ADD col2 nvarchar(15)NULL

更新dbo.Table_1 SET col2 = col1
ALTER TABLE dbo.Table_1 ALTER COLUMN col2 NVARCHAR(15)NOT NULL
ALTER TABLE dbo.Table_1 DROP COLUMN col1
EXEC sp_rename' dbo.Table_1.col2',' col1',' COLUMN'