我有一份工作,可填充登台表,一旦完成,它将在一个存储过程中截断几个登台表。我遇到的问题是,有时所有这些表都不会被截断,因为它们不为空,因此在下一次插入时会导致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
答案 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)
过去,我已经在具有许多用户连接的数据库中看到了这个问题。
另一个选项可扩展层,截断表,缩小。