1

次のスクリプトをどうにか最適化できないだろうか。おそらく最新の行を削除して再挿入するため、ディスクに大量に書き込みます。「insert ... on duplicate key update」のようなものを適用することを考えていたところ、単一行の更新の可能性がいくつか見つかりましたが、コンテキストでそれを適用する方法がわかりません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_searchentrysearch_tsvこれらの列に基づいて列の値を設定するテーブルにトリガーがあります。

(content_type_id, object_id_int)inwatson_searchentryはテーブル内の一意のペアですが、atm インデックスは存在しません (使用できません)。

このスクリプトは、検索インデックスを完全に再構築するために 1 日に 1 回、場合によってはデータをインポートした後に実行する必要があります。

4

1 に答える 1