postgresqlデータベースでfdwを使用すると、クエリの数が遅くなりすぎます

postgresqlデータベースでfdwを使用すると、クエリの数が遅くなりすぎます

過去数日間、管理データベースは、fdwを使用して作成されたテーブルがいくつかあることを検出しました。データ量が多いため、クエリ速度が20秒から1000秒以上に変更されました。同じデータベースにないため、元のテーブルのデータ量が多すぎるか、通常のテーブルであるため、接続に使用できるのはfdwのみです。

原因分析

元のテーブルが多いため、fdw送信の問題が遅いと思われます。

解決

ビューを作成して制限します。
ビジネス側と話し合ったところ、一部のテーブルではすべてのデータが必要ではなく、過去数日間のデータのみが必要であることがわかりました。元のテーブルが配置されていたモードでビューを作成することにしました。過去数日間のデータのみをフェッチします。

CREATE VIEW sss as
 SELECT id
.........................................
   FROM ‘表名’
  WHERE (commit_date >= ((now())::date + '-10 days'::interval))

fdwの外部テーブルを(元のテーブルからビューに)再作成するときに、指定されたテーブルを変更します

--创建外部服务器
-- 括号里的三个参数,分别是timescaledb的ip、端口和数据库名称

CREATE SERVER baba FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '0.0.0.0', port '5432', dbname 'hrmw');
--创建用户映射
-- 括号里的两个参数,分别是timescaledb数据库的用户名、密码
create user mapping for postgres server baba options(user 'postgres', password '数据库密码');
CREATE FOREIGN TABLE "public"."表名" (
  ...........  --字段
)
SERVER "baba" -- 外部链接名
OPTIONS ("schema_name" '模式名', "table_name" 'v_base_promise') --指定模式和视图
;

テスト後、変更されたクエリは約10秒しかかかりません

修正する前に

ここに画像の説明を挿入します

変更後、
ここに画像の説明を挿入します
元々はfdwを使用してすべてを送信し、フィルタリングを実行していましたが、現在はビューを使用して必要なデータをフェッチしてから、fdwを使用して送信します。

次に、通常のテーブルをパーティションテーブルに変更します

通常のテーブルをパーティションに変更します。インターネットには多くの紹介があります。ここでは説明しません。linkpgデータベースをパーティションテーブルに変更
ます。通常のテーブルをパーティションに変更すると、効率が向上します。

(つづく)

おすすめ

転載: blog.csdn.net/yang_z_1/article/details/114867223