Sql Truncate语句占用太多时间

Sql Truncate语句占用太多时间,sql,azure,truncate,Sql,Azure,Truncate,我有一个表,它有超过100万条记录,我创建了一个存储过程在表中插入数据,在插入数据之前,我需要截断表,但是截断太长了 我在一些链接上读到,如果一个表被另一个人使用,或者应用了一些锁,那么truncate需要花费太长的时间,但在这里,我是唯一的用户,我没有应用任何锁 另外,当我试图截断表时,没有打开其他事务 由于我的数据库位于SQL Azure上,我不应该删除索引,因为它不允许我在没有索引的情况下插入数据。从Azure删除数据时,可能会遇到各种各样的麻烦,但截断几乎总是一个锁定问题。如果你不能解决

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

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

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


由于我的数据库位于SQL Azure上,我不应该删除索引,因为它不允许我在没有索引的情况下插入数据。

从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

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

我不熟悉SQL Azure,但truncate语句应该几乎是即时的。在SQLServer2008R2中,我有一个表,其中有360M行需要删除。立即截断。确保表上没有阻塞会话。作为标准过程,我使用的其中一个组会删除并重新创建所有表和索引,而不是截断,您可以尝试一下。但这并不需要很长时间。我也使用这种方法删除表,但再次创建表需要很长时间,现在我的查询不使用truncate,需要15分钟才能完成所有操作,但添加truncate时,需要一个多小时才能完成执行。你能发布整个脚本吗?听起来这里好像还有别的事。