我有一个存储过程,可以将记录从明细表复制到历史表。它将每天运行一次。明细表记录量几十万。将详细信息复制到历史表需要 2 个小时以上。
如何提高性能?
我的程序:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[sp_Job_Archive_Record_Count]
@p_ToDate DATETIME,
@p_Detail_Ins INT OUTPUT,
@p_Detail_Del INT OUTPUT,
@p_Header_Ins INT OUTPUT,
@p_Header_Del INT OUTPUT
as
BEGIN TRAN
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
INSERT into tbl_Detail_History
SELECT * FROM tbl_Detail WITH(NOLOCK)
WHERE i_HeaderKey IN
(SELECT i_HeaderKey FROM tbl_Header WITH(NOLOCK)
WHERE d_dateTime <= cast(@p_ToDate AS DATETIME)
)
SET @p_Detail_Ins = @@ROWCOUNT
INSERT INTO tbl_Archive_Count values('Detail',@p_Detail_Ins,getdate (),@p_ToDate)
DELETE FROM tbl_detail
WHERE i_DetailKey IN
(SELECT i_DetailKey FROM tbl_Detail_History WITH(NOLOCK))
SET @p_Detail_Del = @@ROWCOUNT
INSERT INTO tbl_Header_History
SELECT * FROM tbl_Header WITH(NOLOCK)
WHERE d_dateTime <= cast(@p_ToDate as DATETIME)
SET @p_Header_Ins = @@ROWCOUNT
INSERT INTO tbl_Archive_Count values('Header',@p_Header_Ins,getdate(),@p_ToDate)
DELETE FROM tbl_Header
WHERE i_Headerkey IN
(SELECT i_HeaderKey FROM tbl_Header_History WITH(NOLOCK))
SET @p_Header_Del = @@ROWCOUNT
IF (@@ERROR <> 0)
BEGIN
ROLLBACK TRAN
END
COMMIT TRAN
最佳答案
根据索引和 tbl_detail 和 tbl_detail_history 之间的行比变化
DELETE FROM tbl_detail
WHERE i_DetailKey IN
(SELECT i_DetailKey FROM tbl_Detail_History WITH(NOLOCK))
到
DELETE FROM tbl_detail D
WHERE exists (select 1 from FROM tbl_Detail_History WITH(NOLOCK) where i_DetailKey = d.i_DetailKey)
可以使用 tbl_header 删除进行类似的更改。如果您获得了您正在寻找的性能提升,我还建议删除无锁提示,特别是在 delete 语句上,因为您可能会在那里遇到完整性问题。查看 read_committed_snapshot,它可能有用
HTH
关于sql - 使用存储过程将记录从详细信息表移动到历史表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20047225/