【发布时间】:2010-11-14 10:38:00
【问题描述】:
我在下面设计了一个使用 Sql Server 2005 的存储过程来比较每个 Profile 和 Source 表中的 300 万条记录,并用另一个表 (PROFILE_BC) 中存在的记录更新 Source 表,该表也将有大约 300 万条记录. 我正在尝试优化下面的代码。你能建议任何其他方法吗?我只是担心这需要6个多小时才能完成。我们可以使用 DTS 做同样的事情吗?以及如何使用 DTS 完成此操作的想法。有人建议可以使用一个名为 Lookup,Fuzzy Lookup 的组件。欢迎任何关于优化的想法。
USE Database
GO
/****** Object: StoredProcedure [dbo].[ProcName] Script Date: 11/13/2010 17:15:04 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[ProcName]
AS
BEGIN
SET NOCOUNT ON;
DECLARE @not_on_ebc_file_xx## char(2);
SET @not_on_ebc_file_xx## = 35;
DECLARE @voters_no varchar(18);
DECLARE @candidate_id char(10);
DECLARE @perm_disq_temp char(2);
DECLARE @voters_no_jms varchar(18);
DECLARE PROFILES_CURSOR CURSOR LOCAL FAST_FORWARD
FOR SELECT CP.CANDIDATE_ID, CP.VOTERS_NO FROM PROFILE CP INNER JOIN SOURCE SR ON
CP.CANDIDATE_ID = SR.CANDIDATE_ID
WHERE CP.CANDIDATE_ID NOT LIKE 'MA%';
OPEN PROFILES_CURSOR;
FETCH NEXT FROM PROFILES_CURSOR
INTO @candidate_id, @voters_no;
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @voters_no_jms = VOTERS_NO FROM PROFILE_BC WHERE VOTERS_NO = @voters_no;
SELECT @perm_disq_temp = PERM_DISQ FROM SOURCE WHERE CANDIDATE_ID = @candidate_id;
IF (@voters_no_jms = @voters_no) -- record exists in jms_temp table/ebc file
BEGIN
IF (@perm_disq_temp = @not_on_ebc_file_xx##)
BEGIN
UPDATE SOURCE SET PERM_DISQ = '' WHERE CANDIDATE_ID = @candidate_id;
END
END
ELSE
BEGIN
IF (@perm_disq_temp = '' OR @perm_disq_temp IS NULL)
BEGIN
UPDATE SOURCE SET PERM_DISQ = @not_on_ebc_file_xx## WHERE CANDIDATE_ID = @candidate_id;
END
END
SET @voters_no_jms = '';
FETCH NEXT FROM PROFILES_CURSOR INTO @candidate_id, @voters_no;
END
CLOSE PROFILES_CURSOR;
DEALLOCATE PROFILES_CURSOR;
END
【问题讨论】:
标签: sql sql-server sql-server-2005 tsql