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データベースをパーティションテーブルに変更
します。通常のテーブルをパーティションに変更すると、効率が向上します。
(つづく)