2

ストアド プロシージャで、キーの配列を生成しており、それをテーブルのキーの配列と比較したいと考えています。2 つの配列を比較して、両方に一致する値が少なくとも 1 つあるかどうかを確認する最も速い方法は何ですか?

これまでのところ、次のことを試しました。

  • 生成されたキーをループし、キー フィールドと比較します (遅い)。
  • 配列で配列操作オーバーラップ (&&) を使用する

テーブルの定義は次のとおりです。solicitation

id bigint NOT NULL DEFAULT nextval('id_seq'::regclass),
type_id bigint,
name character varying(2000),
key character varying[],
status bigint

ストアド プロシージャのサンプル コード

-- keys = list of generated keys
FOR _id, _name, _type IN
   SELECT rec.eid, rec.domain, rec.name, rec.type_id
   from   solicitation rec 
   where  rec.key && _keys
   and    rec.status in (1201, 1202, 1241)
LOOP
...
END LOOP;

keyインデックスされています。

4

2 に答える 2

2

配列オーバーラップ操作 (&&) の使用は高速でしたが、速度が低下したのは、生成された配列の NULL が原因でした。

NULL を削除すると、数百万のテーブル サイズでパフォーマンスが 6 秒から 300 ミリ秒に向上しました。

于 2012-12-16T15:29:05.883 に答える
1

postgresql の配列演算子はかなり高速です。

GINただし、パフォーマンスを向上させるにはインデックスを使用する必要があることに注意してください。

ほとんどの場合、DB サーバーでジョブを実行するとパフォーマンスが向上しますが、データベース サーバーが過負荷の場合は、データベースのレプリカを作成するよりも Web サーバーのレプリカを作成する方が簡単であるため、DB サーバーから Web サーバーに負荷を移動するようにしてください。 、Web サーバー全体の負荷をより適切に管理します。

于 2012-12-14T15:43:58.150 に答える