使用另一个表中的字符串匹配更新主表

时间:2014-07-02 11:29:18

标签: sql-server

这是我的表结构

Temp_camp(id int identity,email varchar(100),shot_id bigint)
insert into Temp_camp values(email)('xyz@gmail.com'),('y2k@yahoo.com'),('maaki@quora.com')

和其他表结构

tb_adhar(shot_id bigint,email varchar(100))
insert into tb_adhar values(100,'xyz@gmail.com'),(200'y2k@yahoo.com')

tb_adhar每天下午6点后会10^6 records获得批量加载..

所以我需要使用tb_adhar

中的shot_id更新Temp_Camp(shot_id)

我写了这个查询,但这需要很长时间才能完成!

这是查询

update temp_camp
set shot_id=t.Shot_id from tb_adhar t join temp_camp c on t.email=c.email

I only wanted to know if there are bugs in code?? i dont want to mess up with the client data!

2 个答案:

答案 0 :(得分:0)

如果您还没有这样做,可以采取哪些措施来提高性能。由于您要加入email上的表格,因此您可以在两个表格的email列上添加其他索引,然后在索引中的tb_adhar表格中添加shot_id列。 我应该注意,添加这些索引会降低插入操作的速度。

CREATE NONCLUSTERED INDEX Temp_camp_index_email 
ON Temp_camp(email)

GO

CREATE NONCLUSTERED INDEX tb_adhar_index_email 
ON tb_adhar (email)
INCLUDE (Shot_id);

GO

答案 1 :(得分:0)

我认为您的代码没问题,但是您正在进行相当大的更新,而SQL Server并不那么喜欢。我有类似的问题,我通过将整个操作拆分为较小的事务来解决它。试试这个:

DECLARE 
@ChunkSize int = 100000,
@ChunkNumber int,
@ChunkID int = 0

SELECT @ChunkNumber = COUNT(*) / @ChunkSize + 1
FROM tb_adhar

WHILE @ChunkID < @ChunkNumber
BEGIN
    update temp_camp
    set shot_id=t.Shot_id 
    from (select * from (
            select tt.*, 
            ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) rnum
            FROM tb_adhar tt) 
           WHERE rnum BETWEEN @ChunkID * @ChunkSize AND (@ChunkID + 1) * @ChunkSize) t  
        join temp_camp c on t.email=c.email

    SET @ChunkID += 1
END

还有一件事:你说tb_adhar表每天获得10 ^ 6条新记录。尝试找到一种仅识别新记录的方法。否则你的查询每次都做同样的事情 - 假设它将20mil旧行更新为相同的值和1mil的新行 - 实际有用的工作。