Postgres - 是否有更快的方法来更新来自其他数据库的信息表?

时间:2012-06-01 05:32:25

标签: sql postgresql postgresql-9.1

我正在更新一个名为Recipes的表,并将ImageUrl列设置为VIEW中的匹配行。我的UPDATE语句是:

UPDATE Recipes R
  SET ImageUrl=L.ImageUrl
  FROM Link.Recipes L
  WHERE L.RecipeId=R.RecipeId AND L.ImageUrl is not null;

Link.Recipes是一个VIEW,它返回来自不同服务器上另一个数据库的所有Recipes行,所以它已经很慢了:

  

查询成功返回:8541行受影响,173236 ms执行   时间。

我想看看是否有办法让它快一点。涉及具有相似行数的相同视图的INSERT语句很多更快,因此这里有不同的内容。

RecipeId当然有一个索引,但是ImageUrl在这两个表中都没有索引。有没有更好的方法我可以写这个UPDATE语句,不会花费近3分钟?

说明:

'Update  (cost=0.00..4136.54 rows=995 width=1531)'
'  ->  Nested Loop  (cost=0.00..4136.54 rows=995 width=1531)'
'        ->  Function Scan on dblink t1  (cost=0.00..10.00 rows=995 width=266)'
'              Filter: (imageurl IS NOT NULL)'
'        ->  Index Scan using recipes_pkey on recipes r  (cost=0.00..4.13 rows=1 width=1281)'
'              Index Cond: (r.recipeid = t1.recipeid)'

解释分析:

'Update  (cost=0.00..4233.18 rows=995 width=1532) (actual time=168887.016..168887.016 rows=0 loops=1)'
'  ->  Nested Loop  (cost=0.00..4233.18 rows=995 width=1532) (actual time=23689.440..24500.006 rows=8549 loops=1)'
'        ->  Function Scan on dblink t1  (cost=0.00..10.00 rows=995 width=266) (actual time=23689.250..23749.288 rows=8550 loops=1)'
'              Filter: (imageurl IS NOT NULL)'
'        ->  Index Scan using recipes_pkey on recipes r  (cost=0.00..4.23 rows=1 width=1282) (actual time=0.083..0.085 rows=1 loops=8550)'
'              Index Cond: (r.recipeid = t1.recipeid)'
'Trigger trg_recipes_searchupdate: time=3808.617 calls=8549'
'Total runtime: 168889.272 ms'

1 个答案:

答案 0 :(得分:1)

可能值得在imageurl上创建部分索引而不是null。在此处详细了解:http://www.postgresql.org/docs/current/static/indexes-partial.html