2
下面我设计了一个存储过程,用于对比下面的每个Profile和Source Table中的300万条记录,并使用另一个表中存在的记录(PROFILE_BC)更新Source表)也将有约300万条记录。 我想优化下面的这段代码。你能提出任何其他方法吗?我只是担心这将需要6个多小时才能完成。我们可以使用DTS来做同样的事吗?并想法如何使用DTS来完成。一些人建议有一个叫做Lookup的组件,可以使用模糊查找。欢迎任何优化相同的想法。优化存储过程以处理300万条记录
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
这里的数据类型是Perm_Disq是char(3)和voters_no是一个varchar(10)。我想知道是否CASE时PROFILE_BC.VOTERS_NO = PERM_DISQ.PERM_DISQ比较是正确的。你也会建议一个错误处理代码在回滚之前写入日志文件。 – Ruruboy 2010-11-14 02:27:31
sry很难看到您的查询,因为它没有格式化。我将CASE当PROFILE_BC.VOTERS_NO = PERM_DISQ.PERM_DISQ更改为CASE WHEN NOT PROFILE_BC.VOTERS_NO为NULL,因此如果它找不到与profile_bc表中的voter_no匹配的记录,则该值将为空 – clyc 2010-11-14 02:33:21
您可以始终将其包装一个try/catch块,并用raiserror命令引发一个错误,但是我没有看到它会在这个语句中产生错误,除非你对源表的PERM_DISQ列有一些限制。 – clyc 2010-11-14 02:35:42