sql azure耗时查询
我在SQLAzure中有一个表,其中包含大约600万行。 我想为它创建一个新索引。cmd类似于:sql azure耗时查询,sql,sql-server,azure,Sql,Sql Server,Azure,我在SQLAzure中有一个表,其中包含大约600万行。 我想为它创建一个新索引。cmd类似于: CREATE NONCLUSTERED INDEX [INDEX1] ON [dbo].Table1 ( [Column1] ASC, [Column2] ASC, [Column3] ASC, [Column4] ASC ) INCLUDE ( [Column5],[Column6]) 大约15分钟后,会发生错误 “Msg 10054,第20级,状态0,第0行
CREATE NONCLUSTERED INDEX [INDEX1] ON [dbo].Table1
(
[Column1] ASC,
[Column2] ASC,
[Column3] ASC,
[Column4] ASC
)
INCLUDE ( [Column5],[Column6])
大约15分钟后,会发生错误
“Msg 10054,第20级,状态0,第0行
从接收结果时发生传输级别错误
服务器。(提供程序:TCP提供程序,错误:0-已创建现有连接。)
由远程主机强制关闭。)”
我试了好几次,都犯了同样的错误。
但我执行了其他耗时的查询,如:
插入表1(Col1、Col2、Col3)从表2中选择Col1、Col2、Col3
花了20分钟才成功返回
这些查询是在同一个Sql Azure DB中执行的。我不知道这里发生了什么。有人能帮忙吗?谢谢 我遇到了与包含100万行的at表相同的问题,并联系了Microsoft支持部门。这是我得到的答复: 无法在表上创建索引的原因是 在平台上正面临一个限制,阻止 大于2GB的事务 索引的创建是一个依赖于 执行表页移动的事务日志。更多行 在一个表中,意味着要在T-Log中放入更多的页面。自从你的桌子 包含1亿条记录(这是一个相当大的数字),它是 你很容易达到这个极限 为了创建索引,我们需要改变方法。 基本上,我们将使用一个临时(staging)表来存储 在源表上创建索引时 以前已从数据中清除 行动计划:
select * from sys.event_log
where database_name ='<DBName>'
and event_type <> 'connection_successful'
order by start_time desc
从sys.event\u日志中选择*
其中数据库名称=“”
和事件类型“连接成功”
按开始时间描述订购
。。我发现此错误消息:
由于事务日志过多,会话已终止
空间使用。尝试在单个事务中修改较少的行
谢谢你的回答!实际上,我也找到了根本原因。
有一个解决方案,设置ONLINE=ON,在ONLINE模式下,索引创建任务将被分解为多个小任务,因此T-Log不会超过2GB
但有一个限制,索引创建命令的“include column”不能是大小不限的对象,如nvarchar(max),如果是这样,命令将立即失败 因此,在Sql Azure中,对于如下索引创建操作:
CREATE NONCLUSTERED INDEX [INDEX1] ON [dbo].Table1
(
[Column1] ASC,
[Column2] ASC,
[Column3] ASC,
[Column4] ASC
)
INCLUDE ( [Column5],[Column6])
如果上一个操作失败,请执行以下操作。1.使用“online=on”创建索引
2.如果#1失败,表示第5列或第6列为nvarchar(max),则查询表大小,如果<2GB,则直接使用online=off创建索引。
3.如果#2失败,意味着表大小>2GB,那么在没有临时表参与的情况下,没有简单的方法来创建索引,必须按照ahkvk的回答采取行动。
如果这确实是在Azure上创建大索引的最佳方法,那么我对它失去了很多信心。我们现在在Azure IaaS虚拟机上使用SQL Server。它的工作原理与内部环境完全相同,不受事务日志大小的限制,建议使用ONLINE=ON选项以避免SQL Azure上的这一关键限制。SQL Azure版本12中已删除2GB限制。您可以尝试创建带有索引的新表,然后将行从旧表迁移到新表,然后删除旧表并重命名新表吗?下面是一篇关于此主题的好文章,阐明了您的其他问题很好的提示:只是一个更新;你的暗示使我找到了解决办法。对我来说——希望还有其他人——这是公认的答案+这对我有用。至少第二次尝试。包括([Column5]、[Column6])和(ONLINE=ON);