sql azure耗时的查询

mbm*_*ter 8 sql sql-server azure

我在Sql Azure中有一个表包含大约6M行.我想为它创建一个新索引.cmd就像:

CREATE NONCLUSTERED INDEX [INDEX1] ON [dbo].Table1
(
    [Column1] ASC,
    [Column2] ASC,
    [Column3] ASC,
    [Column4] ASC
)
INCLUDE ( [Column5],[Column6]) 
Run Code Online (Sandbox Code Playgroud)

大约15分钟后,发生错误

"Msg 10054,Level 20,State 0,Line 0

从服务器接收结果时发生传输级错误.(提供者:TCP提供者,错误:0 - 远程主机强行关闭现有连接.)"

我试了好几次,得到了同样的错误.但我已经执行了其他耗时的查询,例如:

插入table1(Col1,Col2,Col3),从table2中选择Col1,Col2,Col3

花了20分钟并成功返回.

查询在同一个Sql Azure DB中执行.我不知道这里发生了什么.有人可以帮忙吗?谢谢!

and*_*rsh 8

我在包含100M行的表中遇到了同样的问题并联系了Microsoft支持.这是我得到的答复:

您无法在表上创建索引的原因是您面临平台上的限制,该限制阻止事务大于2GB.

索引的创建是一种事务操作,它依赖于事务日志来执行表页的移动.表中的更多行意味着要在T-Log中放入更多页面.由于您的表包含1亿条记录(这是一个非常大的数字),因此您很容易达到此限制.

为了创建索引,我们需要改变方法.基本上,当您在源表上创建索引时,我们将使用临时(临时)表来存储数据,这是您之前从数据中清除的.

行动计划:

  1. 创建与原始表相同但没有任何索引的登台表(这使登台表成为堆)
  2. 将数据从原始表移动到临时表(插入更快,因为登台表是堆)
  3. 清空原始表
  4. 在原始表上创建索引(这次事务应该几乎为空)
  5. 将数据从登台表移回原始表(这需要一些时间,因为表包含索引)
  6. 删除登台表

他们建议使用BCP在登台表和原始表之间移动数据.

查看event_log表时...

select * from sys.event_log 
where database_name ='<DBName>'
and event_type <> 'connection_successful'
order by start_time desc
Run Code Online (Sandbox Code Playgroud)

..我发现此错误消息:

由于过多的事务日志空间使用,会话已终止.尝试在单个事务中修改较少的行.

  • 如果这确实是在Azure上创建大型索引的最佳方法,那么我对它失去了很大的信心. (3认同)