sqlserver大数据量update问题? 200
请问各位大神,我要对sqlserver数据库一个表进行update,数据量大概是200多万,如果直接update,sql如下:UPDATEtable_nameSETsta...
请问各位大神,我要对sqlserver数据库一个表进行update,数据量大概是200多万,如果直接update,sql如下:
UPDATE table_name
SET status = '2'
WHERE status = '1'
AND bill= '001'
执行速度特别慢。所以,我改成循环多次update,sql代码如下:
DECLARE @i INT
SET @i = 1
WHILE @i < 5
BEGIN
UPDATE TOP (100) table_name
SET status = '2'
WHERE status = '1'
AND bill= '001'
SET @i = @i + 1
END
这种情况事务是每循环一次,提交一次,还是所有循环都完成,才提交的?
另外,对于这种批量更新的问题,有没有其他方案,谢谢! 展开
UPDATE table_name
SET status = '2'
WHERE status = '1'
AND bill= '001'
执行速度特别慢。所以,我改成循环多次update,sql代码如下:
DECLARE @i INT
SET @i = 1
WHILE @i < 5
BEGIN
UPDATE TOP (100) table_name
SET status = '2'
WHERE status = '1'
AND bill= '001'
SET @i = @i + 1
END
这种情况事务是每循环一次,提交一次,还是所有循环都完成,才提交的?
另外,对于这种批量更新的问题,有没有其他方案,谢谢! 展开
2个回答
展开全部
我拿到sql一看是update语句,想都没多想直接加并行,但是加了并行发现子查询根本没有用到并行,而且整体cost没有什么变化。我仔细想了想,这种写法oracle内部是通过单条跟新的方式进行,从p_t中那出一条记录去c_t中匹配,c_t中采用索引扫描,然后再通过rowid访问表取到name。所以优化器计算后,不会对子查询中的c_t应用并行,因为此时并行会采用全表扫描,效率肯定没有索引扫描快。语句和执行计划如下:
update /*+parallel(p_t,4)*/ p_t set name=(select /*+parallel(c_t,4)*/ name from c_t where p_t.id=c_t.id) where p_t.name is null;
update /*+parallel(p_t,4)*/ p_t set name=(select /*+parallel(c_t,4)*/ name from c_t where p_t.id=c_t.id) where p_t.name is null;
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询