/***** SQL关联更新测试,Student表数据量200W,Score表数据量600W ****/
print 'update 关联更新'; --CPU 13353ms Time 7954ms ,Rows 3005139
set statistics time on
update [dbo].[Score] set [Score]=[Score]+2 from [dbo].[Score] as sc
inner join [dbo].[Student] as st on sc.StudentId=st.Id
where st.Age>50;
set statistics time off
print '-----------------------------------';
print 'in 更新' --CPU 13496ms Time 21101ms ,Rows 3005139
set statistics time on
update [dbo].[Score] set [Score]=[Score]+2 where StudentId in (select Id from [dbo].[Student] as s where s.Age>50)
set statistics time off
print '-----------------------------------';
print 'exists 更新' --CPU 13526ms Time 20989ms , Rows 3005139
set statistics time on
update [dbo].[Score] set [Score]=[Score]+2 where exists (select s.Id from [dbo].[Student] as s where s.Id=[dbo].[Score].StudentId and s.Age>50)
set statistics time off
看测试结果, 为什么exists没有比in明显的快???
------解决方案--------------------
LZ ,你跑一下 用 Student 中某个字段列 Score 中的某个字段,关联字段还有现有的条件。再看看结果。
------解决方案--------------------
/***************************************************************************************************************/
/*
1.很明显你的scord.id and student.id is the primary key,因此,in 是不考虑null情况的
,and exists的优势因为primary key没有发挥出来
2.根据不同的sql版本优化器的优化是越来越优秀
3.对于你来说,你运行三次,都是相同状况下,对于,cpu,内存来说可不一定,快几百ms而已
4.第一种,索引查找表一边,第二种,第三种索引查找表N遍,第一种快是理所应当的
*/
/***************************************************************************************************************/