代码之家  ›  专栏  ›  技术社区  ›  BIDeveloper

截断语句占用太多时间

  •  3
  • BIDeveloper  · 技术社区  · 10 年前

    我有一个表,它有超过100万条记录,我创建了一个存储过程来在该表中插入数据,在插入数据之前,我需要截断该表,但截断时间太长。

    我在一些链接上读到,如果一个表被另一个人使用或应用了一些锁,那么截断需要很长时间,但在这里我是唯一的用户,我没有应用任何锁。

    当我试图截断表时,也没有其他事务打开。

    由于我的数据库位于SQLAzure上,我不应该删除索引,因为它不允许我插入没有索引的数据。

    2 回复  |  直到 10 年前
        1
  •  4
  •   user4725980 user4725980    9 年前

    删除表中的所有索引,然后截断,如果要插入数据,请插入数据,插入数据后重新创建索引

        2
  •  -1
  •   Archlight    10 年前

    从Azure中删除时,您可能会遇到各种各样的麻烦,但截断几乎总是一个锁定问题。如果你无法解决这个问题,你可以在从Azure删除时始终使用这个技巧。

    declare @iDeleteCounter int =1
    while @iDeleteCounter > 0
    begin
        begin transaction deletes;
        with deleteTable as
        (
            select top 100000 * from  mytable where mywhere
        )
        delete from deleteTable
        commit transaction deletes
        select @iDeleteCounter = count(1) from   mytable where mywhere
    
        print 'deleted 100000 from table' 
    
    end