【发布时间】:2014-01-03 05:30:16
【问题描述】:
我有两个表 Old_Table 和 New_Table。我的旧表目前有 1300 万条记录,我需要处理旧表中的数据并将其转储到新表中。数据将不断插入到我的旧表中。于是,我写了一个存储过程,并创建了一个 sql 作业,每晚运行并处理当天插入旧表中的数据。
我的程序要花很多时间。就像,我的程序每天需要处理 1300 万条记录,并且 sql 作业自启动以来就一直在运行。如何优化我的以下程序以使其更快
select @From = Max(InsertTime) From [New_Table];
set @To = GETDATE();
declare @ID as int;
set @ID = 0;
SET @ID = (SELECT MIN(Id) FROM Old_Table where TimeStamp > @From and TimeStamp < @To)
WHILE @ID IS NOT NULL
BEGIN
--Get the row data
SELECT @col1 = COLUMN1,
@col2 = case when CHARINDEX('?', COLUMN2) > 0
THEN SUBSTRING(COLUMN2, 1,CHARINDEX('?', COLUMN2)-1)
else COLUMN2
END,
@col3 = [dbo].[ModifyString] (COLUMN3)
from Old_Table with(nolock)
where Id = @ID;
--Few if conditions
select @rowID = ID from [dbo].[New_Table] with(nolock)
where [COL1] = @col1 and [COL2] = @col2 and [COL3] = @col3
--If exists update the row else insert as new row
If @rowID > 0
Begin
-- Update my New_Table
End
Else
Begin
-- Insert into my new table
End
--delete from Old_Table
delete from [dbo].[Old_Table] where id = @ID
--Fetch next record
SET @ID = (SELECT MIN(Id) FROM Old_Table where TimeStamp > @From and TimeStamp < @To);
END
我的函数 [dbo].[ModifyString] 有 5 个 IF 条件,其中使用了 CHARINDEX 和 STUFF 函数。
添加表定义:
[New_Table](
[ID] [int] IDENTITY(1,1) NOT NULL, --Primary Key
[COL1] [varchar](max) NULL,
[COL2] [varchar](max) NULL,
[COL3] [varchar](max) NULL,
[Count] [int] NULL,
[TimeImported] [datetime] NULL, -- Non-Clustered Index
[COL5_NEW] [bit] NULL,
[COL6_NEW] [bit] NULL,
[COL7_NEW] [bit] NULL,
[Old_Table](
[id] [int] IDENTITY(1,1) NOT NULL, -- Primary Key
[TimeStamp] [datetime] NOT NULL, -- Non-Clustered Index
[COL1] [varchar](max) NULL,
[COL2] [varchar](max) NULL,
[COL3] [varchar](max) NULL,
编辑:我的旧表有重复记录,新表中的 [Count] 需要为旧表中的每个重复记录递增。
谢谢。
【问题讨论】:
-
你有没有查看查询执行计划,看看查询的哪一部分是瓶颈?还发布包含索引的表定义可能会有所帮助。
-
经典 RBAR(逐行)代码。 :
-
请考虑将其发布到dba.stackexchange.com 以获得更好的目标受众。
-
您提到 old_table 有 1300 万行,每天都有新记录进来。在处理和转储到新表期间,您只需处理今天加载的数据。那么平均每天加载的新数据是多少。如果存储空间不是关键问题,我建议也将日常数据转储到暂存区,然后让夜间工作从那里跑掉。工作完成后,为新的一天清理那个集结区。如果作业失败或最多运行一天左右,您将在暂存区域拥有 1 到 3 天的价值数据,而不是每天 13M+ 数据。
-
@AnupShah 我不会每天查询 13M 条记录。我正在开始一项新工作来清理旧表中的数据,一旦完成了给定日期之前的所有历史数据,它将只处理当天插入其中的记录。
标签: sql-server sql-server-2008 tsql stored-procedures