3

テーブルは PostgreSQL 9 データベースで分割されています。次のスクリプトを実行すると:

select * from node_channel_summary
where report_date between '2012-11-01' AND '2012-11-02';

完全なテーブル スキャンを実行せずに、適切なテーブルからデータを送信します。それでも、このスクリプトを実行すると:

select * from node_channel_summary
where report_date between trunc(sysdate)-30 AND trunc(sysdate)-29;

この場合、パフォーマンスが許容できない完全なテーブル スキャンを実行します。-30 と -29 はパラメータに置き換えられます。

いくつかの調査を行った後、Postgres は関数と分割されたテーブルで適切に動作しません。

誰かがこの問題を解決するための回避策を知っていますか?

4

1 に答える 1

1

問題は、関数をコンパイルするときにPostgreSQLが実行プランを計算してキャッシュすることです。PostgreSQLはクエリプランナーを使用してパーティションを削除するため、これはパーティションテーブルの問題です。これを回避するには、クエリを文字列として指定し、実行時にPostgreSQLにクエリの再解析と再計画を強制します。

FOR row IN EXECUTE 'select * from node_channel_summary where report_date between trunc(sysdate)-30 AND trunc(sysdate)-29' LOOP
    -- ...
END LOOP;

-- or
RETURN QUERY EXECUTE 'select * from ...'
于 2012-12-04T15:00:42.840 に答える