問題タブ [postgres-fdw]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
postgresql - PostgreSQL は同じトランザクションでビューを作成し、外部スキーマをインポートします
sourcedb のスキーマから targetdb に外部データ テーブルを作成できるように、2 つのデータベース (sourcedb、targetdb) の間に postgres_fdw をセットアップしました。
上記のすべてが構成され、期待どおりに機能しています。
次のステップは、sourcedb のビューを変更するたびに外部スキーマを再インポートすることでした。
これを実現するために、sourcedb に 2 つの関数を作成しました。
- fn_create_views
- fn_recreate_foreign_data_tables
最初の関数 (fn_create_views) では、ビューをループで動的に作成しています。ループが終了した後、targerdb に接続している dblink を介して、すべての外部データ テーブルとインポート外部スキーマを削除する 2 番目の関数を呼び出しています。
上記で発生している問題は、「IMPORT FOREIGN SCHEMA」中に「CREATE VIEW」が結果としてコミットされないことです。ただし、すべての外部テーブルが削除され、targetdb スキーマに何もインポートされません。
ここSOでいくつかの投稿を読んだ後、同じDBでdblinkを介して「CREATE VIEW」コマンドを実行することをお勧めする人もいます。dblink は毎回別のトランザクションを開くと思うので、どうやらこれは完全に機能します。
私の質問は、上記の関数を個別に呼び出さずに上記を実行する別の簡単な方法はありますか?
ありがとうございました!
sql - PostgresSQL の入れ子になったループ - INNER JOIN を実行するときにプランナーが入れ子になったループを使用することを決定するのはいつですか?
プランナーが入れ子になったループを使用することを決定した INNER JOIN を使用してクエリを実行しています。同じ結果を返すがネストされたループを使用しないように、異なる WHERE 条件でクエリを作成しようとしたため、WHERE 条件に関係があることがわかりました。
私の質問は、両方のクエリが同じ結果を返すため、クエリが同じように見えるのに、プランナーが異なる決定を下すことにしたのはなぜですか? クエリはネスト ループを使用して 77 秒で実行され、ネスト ループを使用せずに 13 秒で実行されます。13 秒で実行されるクエリは非常に見苦しく洗練されていないため、もっと良い書き方があると思います。
ここに 2 つのクエリがあります。2 つの違いは、WHERE 句が日付でフィルタリングする方法であることに注意してください。最初の句では BETWEEN が使用され、2 番目の句では一連の OR ステートメントが使用されます。current_date が独自のサブクエリにラップされているのは奇妙だと認識していますが、それはこれらのクエリが外部データ ラッパーを使用しているためです。これにより、 current_date を不変オブジェクトとして渡して、パフォーマンスを大幅に高速化できます。
それぞれの EXPLAIN ANALYZE は次のとおりです。
Ubuntu 18.04 サーバーで PostgreSQL 12.1 を実行しています。
ご不明な点がございましたら、お気軽にお問い合わせください。ありがとう!
postgresql - PostgreSQL - 外部スキャンを実行するときにプランナーが行数を過小評価するのはなぜですか?
外部データ ラッパー (postgres_fdw) を介して INNER JOIN を使用してクエリを実行しています。EXPLAIN ANALYZE を表示すると、Foreign Scan サブノードの 1 つが、実際には 7 行をスキャンするときに 1 行しかスキャンしないと過小評価されていることが示され、クエリが発生します。これにより、他の外部スキャン サブノードが 7 回ループし、これがクエリの主なボトルネックになるためです。クエリとそれぞれの EXPLAIN ANALYZE は次のとおりです。
default_statistics_target の値を 1000 に上げた後、両方のテーブルで ANALYZE を実行しようとしましたが、プランナーは変更されませんでした。
BETWEEN を使用してクエリの WHERE 部分を一連の OR ステートメントに変更した場合にも注意する必要があります。 、クエリはネストされたループを使用せず、7 倍の速度で実行されます。BETWEEN を使用したり、一連の OR ステートメントを使用しても同じ結果が得られる理由はよくわかりませんが、Foreign Scan の行数を過小評価しているプランナーに関係していると思います。
Ubuntu 18.04 サーバーで PostgreSQL 12.1 を実行しています。
ご不明な点がございましたら、お気軽にお問い合わせください。ありがとう!