Я обновляю таблицу с именем 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 мс.
Я хотел бы посмотреть, есть ли способ сделать это немного быстрее. Операторы 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'
INSERT INTO Recipes SELECT * FROM Link.Recipes;
- person Mike Christensen   schedule 01.06.2012