【问题标题】:Create Index On Azure Returns Error在 Azure 返回错误时创建索引
【发布时间】:2014-08-19 00:22:31
【问题描述】:

我在 Azure 中有一个超过一百万行的表,我正在尝试使用以下 SQL 添加聚集索引:

CREATE CLUSTERED INDEX IX_MyIdxName
ON [MyApp].MyTable([MyColumn])
WITH (DROP_EXISTING=ON)
ON [Primary]

当我通过网络界面执行此操作时,它运行了一个多小时,然后失败并出现错误:

Failed to read the status of the response

如果我通过 SQL Management Studio 执行此操作,它会运行半小时然后失败并出现错误:

40552: The session has been terminated because of excessive transaction log 
space usage. Try modifying fewer rows in a single transaction.

我明白它在说什么,但我能做些什么呢?我想创建这个聚集索引,那么如何解决这个事务日志大小问题?

谢谢

【问题讨论】:

  • 使用所需的聚集索引创建一个单独的表,然后以块的形式移动数据,例如一次 10,000 行。 Roughly similar concept to this。然后删除旧表并重命名新表。
  • 我正要提出与 Aaron Bertrand 相同的建议 - 这不是一个有趣的解决方案,但它应该可以工作。
  • 呸。好,谢谢。如果有人想让它成为答案,我可以标记它。

标签: sql sql-server azure azure-sql-database clustered-index


【解决方案1】:

会话因事务日志空间过多而终止。我不确定您是哪个性能层级,但升级到 V12 将有助于解决此问题,因为我看不到由于事务日志空间而受到限制并且受到可用日志空间的限制。 您可以执行以下操作: 1.升级到V12 2. 使用 sys.dm_db_partition_stats 查找表的总大小 3 使用 sys.database_files 知道可用的日志大小 4. 如果日志大小至少为 1.5 -2x(只是一个粗略的数字,以确保您不会命中日志满),请执行在线索引重建。

【讨论】:

    【解决方案2】:

    您也可以尝试使用(online=on) 选项创建索引。这应该可以防止长表锁...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-21
      • 1970-01-01
      • 1970-01-01
      • 2020-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多