【发布时间】:2013-06-10 15:00:00
【问题描述】:
“名称”是一个包含大约 100 万行的表。 我已经尝试过这个请求,但它永远不会结束。是否有避免“入”的问题?
update name
set name_val = true
where name_pk in (select max (name_pk)
from name
group by foreign_key_pk);
如果有必要,我不反对触发器。
查询计划:
"Nested Loop (cost=26073.59..26310.38 rows=200 width=54)"
" -> HashAggregate (cost=26073.59..26075.59 rows=200 width=4)"
" -> HashAggregate (cost=23122.82..24598.20 rows=118031 width=12)"
" -> Seq Scan on name (cost=0.00..19956.21 rows=633321 width=12)"
" -> Index Scan using name_pk on name (cost=0.00..1.16 rows=1 width=54)"
" Index Cond: (public.name.name_pk = (max(public.name.name_pk)))"
2 个索引:
CREATE INDEX link_name_foreign_key_pk
ON name
USING btree
(foreign_key_pk);
CREATE UNIQUE INDEX name_pk
ON name
USING btree
(name_pk);
谢谢。
【问题讨论】:
-
执行计划说了什么?表上定义了哪些索引?
-
我已经编辑了我的原始帖子。
-
对于注释,
name_pk代表什么,查询可以这样重写吗? postgres.cz/wiki/… -
尝试在
(foreign_key_pk, name_pk)上建立索引,尤其是在 Postgres 9.2 中,这可能会有所帮助。 -
请记住始终包含 表定义 和您的 Postgres 版本,以解决此类问题。对于初学者来说,看看
NOT NULL约束会有所帮助......
标签: performance postgresql select sql-update