は、私はそれが唯一のトランザクションごとに一度実行する必要があるので、長時間実行クエリの結果をキャッシュするPostgresの関数を作成していますよ私のクエリのすべてを実行し、この機能に参加:インデックスの結果
SELECT mt.*
FROM my_table1 mt
INNER JOIN get_records('new') nr ON mt.id = nr.id
SELECT mt.*
FROM my_table2 mt
INNER JOIN get_records('new') nr ON mt.id = nr.id
SELECT mt.*
FROM my_table3 mt
INNER JOIN get_records('new') nr ON mt.id = nr.id
-- ... many more
私は、これらのうちのどれが最初に実行されるか、またはどのような順序で実行されるかを保証せずに、これらの全体を積み重ねました。
これは、一時テーブルの主キーインデックスが使用されていないことを除いて、正常に機能します。
クエリの結果だけでなく、Postgres関数から「テーブル」を返すにはどうすればよいですか?
- 私は、一時テーブルの代わりに、「where clause doesn't get pushed into view that contains aggregation」問題を回避するマテリアライズド・ビューを構築する機能を使用しています。
- 私はテンポラリテーブルを作成してから、すべてのクエリで直接参照することができますが、クエリを早期に実行するために何らかのブロックメカニズムを組み込む必要があります。そのようなメカニズムを非常にうまくサポートしていません。
一時テーブルを作成しないでください。一時テーブルは使用しないでください。一時テーブルを分析しないでください。 "very_complex_nested_query"を普通の 'sql'関数に入れてください。 'sql'関数を使ったクエリは、PL/pgSQLがオプティマイザに提供するブラックボックスよりはるかに良く最適化できます。 –
@a_horse_with_no_nameしかし、 "very_complex_nested_query"は実行に5分かかっており、結果を何百もの別々のクエリに結合しているので、合計実行時間に日数を追加します。これは、テンポラリテーブルの正確な使用例ではありませんか? 「プレーンSQL関数」とはどういう意味ですか? –
'language plpgsql'の代わりに' language sq'を意味しますが、それをインデックス化したい場合は、tempテーブルにインデックスを作成する必要があります。 –