我在postgres中有一个非常简单的sql update语句。
UPDATE p2sa.observation SET file_path = replace(file_path, 'path/sps', 'newpath/p2s')
观察表有1513128行。到目前为止,查询已经运行了大约18个小时,看不到尽头。
file_path列没有编入索引,所以我猜它正在进行从上到下的扫描,但似乎时间有点过了。可能替换也是一个缓慢的操作。
是否有一些替代或更好的方法来执行这种影响所有行的更新。它本质上是将旧文件路径更新为新位置。它只需要更新一次或将来再次更新。
感谢。
答案 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