加速postgres中的简单更新语句100万行

时间:2017-11-02 08:20:48

标签: sql postgresql performance sql-update

我在postgres中有一个非常简单的sql update语句。

UPDATE p2sa.observation SET file_path = replace(file_path, 'path/sps', 'newpath/p2s')

观察表有1513128行。到目前为止,查询已经运行了大约18个小时,看不到尽头。

file_path列没有编入索引,所以我猜它正在进行从上到下的扫描,但似乎时间有点过了。可能替换也是一个缓慢的操作。

是否有一些替代或更好的方法来执行这种影响所有行的更新。它本质上是将旧文件路径更新为新位置。它只需要更新一次或将来再次更新。

感谢。

1 个答案:

答案 0 :(得分:0)

在SQL中,您可以执行一个while循环来批量更新。

试试这个以了解它的表现。

Declare @counter int 
Declare @RowsEffected int 
Declare @RowsCnt int 
Declare @CodeId int 
Declare @Err int
DECLARE @MaxNumber int = (select COUNT(*) from p2sa.observation)
SELECT @COUNTER = 1
SELECT @RowsEffected = 0


WHILE ( @RowsEffected < @MaxNumber)
BEGIN 
SET ROWCOUNT 10000


UPDATE p2sa.observation 
SET file_path = replace(file_path, 'path/sps', 'newpath/p2s')
where file_path != 'newpath/p2s'

SELECT @RowsCnt = @@ROWCOUNT ,@Err = @@error 
IF @Err <> 0 
BEGIN 
Print 'Problem Updating the records' 
BREAK
END 
ELSE 

SELECT @RowsEffected = @RowsEffected + @RowsCnt 
PRINT 'The total number of rows effected :'+convert(varchar,@RowsEffected) 

            /*delaying the Loop for 10 secs , so that Update is completed*/    

     WAITFOR DELAY '00:00:10'         
 END
 SET ROWCOUNT 0