【发布时间】:2021-06-21 23:46:18
【问题描述】:
我的程序中的一个查询有问题。我有 2 个表:data_all_de 和employees_de。一般来说,我在 10 个国家/地区都有相同的情况,但以“DE”为例。
data_all_de 有 31 列,没有索引和 1 个主键 - id (int)。这张表大概有2M条记录,但是满足查询条件的记录大约有505K条。
employers_de 有 3 列(id int、employer_name varchar(255)、variations varchar[](255) - 数组、无主键、无索引。这里有 44K 条记录。
我的查询看起来:
UPDATE data_all_de
SET company_ok = (SELECT name
FROM employers_de
WHERE employer_name = ANY(variations) LIMIT 1)
WHERE data_all_de.employer_name is not null
AND data_all_de.company_ok is null
AND data_all_de.row_status = 'N';"""
这需要 40 分钟到 60 分钟,具体取决于国家/地区。我尝试用 EXPLAIN 分析它们,所以这是 DE 的输出:
"Update on data_all_de (cost=0.00..3377618.96 rows=627019 width=1642)"
" -> Seq Scan on data_all_de (cost=0.00..3377618.96 rows=627019 width=1642)"
" Filter: ((employer_name IS NOT NULL) AND (company_ok IS NULL) AND (row_status = 'N'::bpchar))"
" SubPlan 1"
" -> Limit (cost=0.00..0.78 rows=1 width=25)"
" -> Seq Scan on employers_de (cost=0.00..908.06 rows=1169 width=25)"
" Filter: (data_all_de.employer_name = ANY ((variations)::text[]))"
"JIT:"
" Functions: 11"
" Options: Inlining true, Optimization true, Expressions true, Deforming true"
我该如何改进呢?使用索引?将此查询拆分为 2 个较小的查询并使用“临时”表?
一般情况下,employees_de 中的数据是不变的,但 data_all_de 中的数据每天都在变化,并且每天都会在向表中插入新数据后执行此查询。
此外,此查询同时针对 10 个国家/地区(10 对 data_all_xx + 雇主_xx)运行。
我将不胜感激。
【问题讨论】:
-
你可能是
employer_name = ANY(variations)。我认为您需要修复数据模型以提高效率——也就是说,使用索引优化数组引用相当棘手。
标签: sql postgresql optimization