【问题标题】:Optimize this simple SQL query?优化这个简单的 SQL 查询?
【发布时间】:2021-12-04 22:37:00
【问题描述】:

我有一个查询,它使用 dblink 从一个数据库回填数据并将其插入到另一个数据库的 jsonb 列中。它只需要运行 1000 条左右的记录,但运行时间很长(30s 到 1 分钟之间)。

为什么?如何让这更快?

这是查询:

CREATE EXTENSION dblink;
update "table" t1 set jsonb_example_column = jsonb_set(jsonb_example_column, '{user}', jsonb_build_object('name',jsonb_example_column->'user'->'name','phone',jsonb_example_column->'user'->'phone','address',jsonb_example_column->'user'->'address','user_id', other_db.user_id)) 
FROM dblink('dbname=$DB_NAME
            port=$DB_PORT
            host=$DB_HOST
            user=$DB_USER
            password=$DB_PASSWORD',
            'SELECT user_id, external_id from other_db_table t2')
AS other_db("user_id" uuid, external_id uuid) WHERE other_db.external_id = t1.external_id;"

【问题讨论】:

  • 这是一个远程表,因此请检查:a) 与远程服务器的网络连接,b) 请求的数据量。如果您通过慢速连接请求大量数据 - 那么这里没有什么意外
  • 如果使用外部表更快,您是否尝试过?
  • "它只需要在 1000 上运行"。那是“other_db_table”的大小吗?如果不是,这个数字是从哪里来的?
  • 我没有尝试过外部表,但会这样做。是的,~1000 是“other_db_table”的大小。
  • 所以外部表要快得多。谢谢,a_horse_with_no_name!

标签: sql postgresql query-optimization


【解决方案1】:

感谢 a_horse_with_no_name,但这是优化后的查询,现在需要三分之一的时间:

CREATE EXTENSION IF NOT EXISTS postgres_fdw;
CREATE SERVER user FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '0.0.0.0', port '5432', dbname 'user');
CREATE USER MAPPING FOR postgres SERVER user OPTIONS (user 'your_foreign_db_user', password 'your_foreign_db_password');
GRANT USAGE ON FOREIGN SERVER user TO postgres;
CREATE FOREIGN TABLE IF NOT EXISTS foreign_table(user_id uuid, external_id uuid) SERVER user OPTIONS (schema_name 'public', table_name 'foreign_db_table');

UPDATE "local_db_table" lt SET jsonb_example_column = jsonb_set(jsonb_example_column, '{user}', jsonb_build_object('name',jsonb_example_column->'user'->'name','phone',jsonb_example_column->'user'->'phone','address',jsonb_example_column->'user'->'address','user_id', ft.user_id))
FROM foreign_table AS ft WHERE lt.external_id = ft.external_id;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 2014-07-06
    • 1970-01-01
    相关资源
    最近更新 更多