这是我的表结构
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
我写了这个查询,但这需要很长时间才能完成!
这是查询
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!
答案 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的新行 - 实际有用的工作。