【发布时间】:2020-09-01 13:17:31
【问题描述】:
一直在为这个更新而苦苦挣扎,永远不会结束
update votings v
set voter_id = (select pv.number from voters pv WHERE pv.person_id = v.person_id);
当前表有 96M 记录
select count(0) from votings;
count
----------
96575239
(1 registro)
更新显然是使用索引
explain update votings v
set voter_id = (select pv.number from voters pv WHERE pv.rl_person_id = v.person_id);
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------
Update on votings v (cost=0.00..788637465.40 rows=91339856 width=1671)
-> Seq Scan on votings v (cost=0.00..788637465.40 rows=91339856 width=1671)
SubPlan 1
-> Index Scan using idx_voter_rl_person_id on voters pv (cost=0.56..8.58 rows=1 width=9)
Index Cond: (rl_person_id = v.person_id)
(5 registros)
这是我的投票索引
Índices:
"votings_pkey" PRIMARY KEY, btree (id)
"votings_election_id_voter_id_key" UNIQUE CONSTRAINT, btree (election_id, person_id)
"votings_external_id_external_source_key" UNIQUE CONSTRAINT, btree (external_id, external_source)
"idx_votings_updated_at" btree (updated_at DESC)
"idx_votings_vote_party" btree (vote_party)
"idx_votings_vote_state_vote_party" btree (vote_state, vote_party)
"idx_votings_voter_id" btree (person_id)
Restrições de chave estrangeira:
"votings_election_id_fkey" FOREIGN KEY (election_id) REFERENCES elections(id)
"votings_voter_id_fkey" FOREIGN KEY (person_id) REFERENCES people_all(id)
伙计们,有什么想法在更新运行缓慢方面发挥了最大的作用?正在使用的行数或连接数?
【问题讨论】:
-
与您的问题无关,但是:
count(0)实际上比 Postgres 中的count(*)慢(并且没有 DBMS,count(0)确实更快) -
很高兴知道!通常我使用 (0) 或 (1) 从来没有考虑过
-
如果
update votings v set voter_id = pf.number from from voters pv WHERE pv.person_id = v.person_id;更快,你可以试试 -
从解释中,确实改进了,会尝试执行它,谢谢@a_horse_with_no_name
标签: sql postgresql database-performance database-administration