Оптимизировать операцию INSERT / UPDATE / DELETE
Интересно, можно ли оптимизировать следующий скрипт? Он много пишет на диск, потому что удаляет, возможно, самые последние строки и вставляет их заново. Я думал о применении чего-то вроде «вставить ... при обновлении дубликата ключа» и нашел некоторые возможности для однострочных обновлений, но я не знаю, как применить это в контекстеINSERT INTO ... SELECT query
.
CREATE OR REPLACE FUNCTION update_member_search_index() RETURNS VOID AS $
DECLARE
member_content_type_id INTEGER;
BEGIN
member_content_type_id :=
(SELECT id FROM django_content_type
WHERE app_label='web' AND model='member');
DELETE FROM watson_searchentry WHERE content_type_id = member_content_type_id;
INSERT INTO watson_searchentry (engine_slug, content_type_id, object_id
, object_id_int, title, description, content
, url, meta_encoded)
SELECT 'default',
member_content_type_id,
web_member.id,
web_member.id,
web_member.name,
'',
web_user.email||' '||web_member.normalized_name||' '||web_country.name,
'',
'{}'
FROM web_member
INNER JOIN web_user ON (web_member.user_id = web_user.id)
INNER JOIN web_country ON (web_member.country_id = web_country.id)
WHERE web_user.is_active=TRUE;
END;
$ LANGUAGE plpgsql;
РЕДАКТИРОВАТЬ: Схемыweb_member
, watson_searchentry
, web_user
, web_country
: http://pastebin.com/3tRVPPVi.
Суть в том, чтобы обновить столбцыtitle
а такжеcontent
вwatson_searchentry
, В таблице есть триггер, который устанавливает значение столбцаsearch_tsv
на основе этих столбцов.
(content_type_id, object_id_int)
вwatson_searchentry
является уникальной парой в таблице, но atm индекс отсутствует (для нее нет смысла).
Этот сценарий следует запускать не чаще одного раза в день для полной перестройки поискового индекса, а иногда и после импорта некоторых данных.