sql - 使用存储过程将记录从详细信息表移动到历史表

标签 sql sql-server performance

我有一个存储过程,可以将记录从明细表复制到历史表。它将每天运行一次。明细表记录量几十万。将详细信息复制到历史表需要 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/

相关文章:

mysql - 参数或从vb6调用到sql代码

mysql - 将级联与复合主键结合使用

sql - 搜索表 - 如果找到结果,则不要搜索下一个表

c# - SQL Server 'ROUND' 与 C# 'Math.Round'

ios - 加速从 SpriteSheet 创建 UIImage

ruby-on-rails - 是否使用 API

同一个表上的查询中的 MySQL 查询

java - com.microsoft.sqlserver.jdbc.SQLServerException : The index 2 is out of range :(

c# - 大于 Linq Join 中的多个条件

php - 具有多个连接的 SQL 查询会影响性能