我正在尝试更改大型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上执行如此长时间运行的查询?
答案 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中大表的列
而是执行以下操作:
答案 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'