与我的笔记本电脑相比,Google SQL 上的 Postgres 查询性能显着下降。为什么?

Dramatic decrease in performance for Postgres query on Google SQL compared to my laptop. Why?

一个相当复杂的(取决于标准)查询 运行ning 在 table 上,有大约 1M 条记录。创建一些临时 tables 并构建数组和 jsonb。

在 localhost 上我得到平均 2.5 秒。 在 Google SQL 我得到 17-19 秒。

注:

  1. 其他查询,如简单选择,在服务器上比在本地更快。应该的。
  2. 我做了 运行 vacuum,重建了所有索引,检查了挂起过程。一切都好。
  3. 我玩资源。创建了一个具有 8 个 VCPU 和 16Gb Ram 的实例。几乎相同的结果。
  4. 我检查了 proc、mem、disc。没问题。

以下是explain analyse最慢查询的结果。 这里是本地的

可能是什么?

可能与 this 重复,但没有回答,已有 2 年且没有标签。我去碰碰运气。

L.E。在文本中详细解释分析

Update on public.customers  (cost=30.38..207.32 rows=127 width=104) (actual time=13105.151..13105.154 rows=0 loops=1)
Planning Time: 1.852 ms
Execution Time: 13105.306 ms
  ->  Hash Join  (cost=30.38..207.32 rows=127 width=104) (actual time=316.371..13091.937 rows=42 loops=1)
"        Output: customers.id, customers.company_id, customers.sap_id, customers.parent_sap_id, jsonb_set(customers.stats, '{consolidatedSales}'::text[], jsonb_build_array(calculateconsolidatedstats(customers.id, customers.sap_id, ((date_part('year'::text, (CURRENT_DATE)::timestamp without time zone) - '2'::double precision))::integer), calculateconsolidatedstats(customers.id, customers.sap_id, ((date_part('year'::text, (CURRENT_DATE)::timestamp without time zone) - '1'::double precision))::integer), calculateconsolidatedstats(customers.id, customers.sap_id, (date_part('year'::text, (CURRENT_DATE)::timestamp without time zone))::integer)), true), customers.tags, customers.account_manager_id, customers.created_by_id, customers.customer_status_id, customers.created_at, customers.updated_at, customers.ctid, parents_with_sales.ctid"
        Inner Unique: true
        Hash Cond: (customers.id = parents_with_sales.id)
        ->  Seq Scan on public.customers  (cost=0.00..74.54 rows=254 width=924) (actual time=0.021..0.419 rows=254 loops=1)
        ->  Hash  (cost=27.88..27.88 rows=200 width=10) (actual time=0.086..0.088 rows=42 loops=1)
"              Output: parents_with_sales.ctid, parents_with_sales.id"
"              Output: customers.id, customers.company_id, customers.sap_id, customers.parent_sap_id, customers.stats, customers.tags, customers.account_manager_id, customers.created_by_id, customers.customer_status_id, customers.created_at, customers.updated_at, customers.ctid"
              Buckets: 1024  Batches: 1  Memory Usage: 10kB
              ->  HashAggregate  (cost=25.88..27.88 rows=200 width=10) (actual time=0.059..0.072 rows=42 loops=1)
"                    Output: parents_with_sales.ctid, parents_with_sales.id"
                    Group Key: parents_with_sales.id
                    Batches: 1  Memory Usage: 40kB
                    ->  Seq Scan on pg_temp_7.parents_with_sales  (cost=0.00..22.70 rows=1270 width=10) (actual time=0.010..0.019 rows=42 loops=1)
"                          Output: parents_with_sales.ctid, parents_with_sales.id"

罪魁祸首查询的 Cloud Logging 结果耗时 12 秒

问题已解决。 问题出在版本上。

简短版本:在 v11 上部署,一切恢复正常。服务器比我的笔记本电脑快,这是应该的。

长版:

  • 尝试在 VMS(2 个 vcpu,4Gb 内存)中进行全新安装。我得到了 20 多秒,甚至比在托管实例中还要糟糕。将资源增加到 16proc、64Gb ram 和 500Gb SSD(用于 IO),所有这些都是该区域允许的最大值。结果令人震惊...时间 增加 到 25 秒
  • 去了 Digital Ocean:托管实例、1 个 VCPU 和 3.6 Gb Ram - 12 秒(这些家伙超级好!)。更好但仍然表现不佳。将实例资源增加到允许的最大值 - 没有明显改善。
  • 没有尝试过 AWS。实验太贵了。 :-)
  • 终于发现我本地安装的版本是11,不是我想的12。回到 gcloud 并尝试使用实例 运行 v11 和......奇迹。像魅力一样工作。

将在其他时间挖掘“为什么 v12 和 v13 这么慢”。