3

私はテーブルを持っています、フー。Fooでクエリを実行して、FooのサブセットからIDを取得します。次に、より複雑な一連のクエリを実行したいと思いますが、それらのIDに対してのみ実行します。これを行うための効率的な方法はありますか?私が考えることができる最善の方法は、次のようなクエリを作成することです。

SELECT ... --complicated stuff
WHERE ... --more stuff
  AND id IN (1, 2, 3, 9, 413, 4324, ..., 939393)

つまり、巨大な「IN」句を作成します。これは効率的ですか?これを行うためのより効率的な方法はありますか、それともIDを取得する最初のクエリで参加する唯一の方法ですか?それが役立つ場合は、SQLObjectを使用してPostgreSQLデータベースに接続し、クエリを実行したカーソルにアクセスしてすべてのIDを取得します。

更新:より複雑なクエリはすべて、これらのIDに依存するか、他のクエリで検索するIDをさらに作成することに注意してください。1つの大きなクエリを実行すると、一度に6つのテーブルを結合することになり、速度が遅すぎる可能性があります。

4

4 に答える 4

6

私が過去に使用した手法の1つは、IDを一時テーブルに配置し、それを使用して一連のクエリを実行することです。何かのようなもの:

BEGIN;
CREATE TEMP TABLE search_result ON COMMIT DROP AS
  SELECT entity_id
  FROM entity /* long complicated search joins and conditions ... */;
-- Fetch primary entities
SELECT entity_id, entity.x /*, ... */
FROM entity JOIN search_result USING (entity_id);
-- Fetch some related entities
SELECT entity_id, related_entity_id, related_entity.x /*, ... */
FROM related_entity JOIN search_result USING (entity_id);
-- And more, as required
END;

これは、検索結果エンティティに複数の1対多の関係があり、a)N * M + 1選択を実行したり、b)関連エンティティのデカルト結合を実行したりせずにフェッチする場合に特に便利です。

于 2010-06-08T22:55:40.867 に答える
1

VIEWを使うと便利かもしれないと思います。IDのクエリを使用してビューを作成し、IDを介してそのビューに参加するだけです。これにより、高価なINステートメントを使用せずに、必要なIDのサブセットに結果を制限できます。

INステートメントはEXISTSステートメントよりもコストがかかることを私は知っています。

于 2010-06-08T22:54:28.950 に答える
0

クエリオプティマイザには正しいことを行うためのより多くのオプションがあるため、IDを選択するための基準との結合がより効率的になると思います。Explain Planを使用して、postgresqlがどのようにアプローチするかを確認してください。

于 2010-06-08T22:33:38.017 に答える
0

ほぼ確実に結合を使用する方が良いですが、別のオプションはサブ選択を使用することです。

SELECT ... --complicated stuff
WHERE ... --more stuff
  AND id IN (select distinct id from Foo where ...)
于 2010-06-09T04:18:52.577 に答える