与我的笔记本电脑相比,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 秒。
注:
- 其他查询,如简单选择,在服务器上比在本地更快。应该的。
- 我做了 运行 vacuum,重建了所有索引,检查了挂起过程。一切都好。
- 我玩资源。创建了一个具有 8 个 VCPU 和 16Gb Ram 的实例。几乎相同的结果。
- 我检查了 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 这么慢”。
一个相当复杂的(取决于标准)查询 运行ning 在 table 上,有大约 1M 条记录。创建一些临时 tables 并构建数组和 jsonb。
在 localhost 上我得到平均 2.5 秒。 在 Google SQL 我得到 17-19 秒。
注:
- 其他查询,如简单选择,在服务器上比在本地更快。应该的。
- 我做了 运行 vacuum,重建了所有索引,检查了挂起过程。一切都好。
- 我玩资源。创建了一个具有 8 个 VCPU 和 16Gb Ram 的实例。几乎相同的结果。
- 我检查了 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 这么慢”。