批量SQL截断vs SQL截断

时间:2018-08-23 15:16:21

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

我有一份工作,可填充登台表,一旦完成,它将在一个存储过程中截断几个登台表。我遇到的问题是,有时所有这些表都不会被截断,因为它们不为空,因此在下一次插入时会导致PK约束。我不知道是否是因为我在Azure中没有足够的DTU。 截断是并行发生的还是要等到一个结束才移到下一个? 我应该分批这样做吗?什么是优点和缺点?

一直不工作

CREATE PROCEDURE truncate_tables
  AS
    BEGIN
     TRUNCATE TABLE dbo.table1;
     TRUNCATE TABLE dbo.table2;
     TRUNCATE TABLE dbo.table3;
     TRUNCATE TABLE dbo.table4;
     TRUNCATE TABLE dbo.table5;
     TRUNCATE TABLE dbo.table6;
    END

建议

CREATE PROCEDURE truncate_tables
  AS
    BEGIN
     TRUNCATE TABLE dbo.table1;
     GO
     TRUNCATE TABLE dbo.table2;
     GO
     TRUNCATE TABLE dbo.table3;
     GO
     TRUNCATE TABLE dbo.table4;
     GO
     TRUNCATE TABLE dbo.table5;
     GO
     TRUNCATE TABLE dbo.table6;
     GO
    END

1 个答案:

答案 0 :(得分:0)

我认为,如果杀死除当前连接之外的现有连接,您可能会得到更好的结果:

DECLARE @kill varchar(8000)='';

SELECT @kill = @kill + 'KILL ' + CONVERT(varchar(5), c.session_id) + ';'

FROM sys.dm_exec_connections AS c
JOIN sys.dm_exec_sessions AS s
    ON c.session_id = s.session_id
WHERE c.session_id <> @@SPID
--WHERE status = 'sleeping'
ORDER BY c.connect_time ASC

EXEC(@kill)

过去,我已经在具有许多用户连接的数据库中看到了这个问题。

另一个选项可扩展层,截断表,缩小。