sql azure耗时查询

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行

我在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行

从接收结果时发生传输级别错误 服务器。(提供程序: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);