我有一个约210万行的Postgres表。我对其进行了以下更新:
WITH stops AS (
SELECT id,
rank() OVER (ORDER BY offense_timestamp,
defendant_dl,
offense_street_number,
offense_street_name) AS stop
FROM consistent.master
WHERE citing_jurisdiction=1
)
UPDATE consistent.master
SET arrest_id=stops.stop
FROM stops
WHERE master.id = stops.id;
该查询运行了39个小时。我在4(物理)核心i7 Q720笔记本电脑处理器上运行此程序,有足够的RAM,大多数时间没有其他运行。没有硬盘空间限制。该表最近已被清理,分析和重新索引。
在查询运行的整个过程中,至少在初始WITH
完成后,CPU使用率通常较低,并且HDD的使用率为100%。HDD使用非常困难,以至于其他任何应用程序的运行速度都比正常运行慢得多。
笔记本电脑的电源设置为“ 高性能(Windows 7 x64)”。
这是说明:
Update on master (cost=822243.22..1021456.89 rows=2060910 width=312)
CTE stops
-> WindowAgg (cost=529826.95..581349.70 rows=2060910 width=33)
-> Sort (cost=529826.95..534979.23 rows=2060910 width=33)
Sort Key: consistent.master.offense_timestamp, consistent.master.defendant_dl, consistent.master.offense_street_number, consistent.master.offense_street_name
-> Seq Scan on master (cost=0.00..144630.06 rows=2060910 width=33)
Filter: (citing_jurisdiction = 1)
-> Hash Join (cost=240893.51..440107.19 rows=2060910 width=312)
Hash Cond: (stops.id = consistent.master.id)
-> CTE Scan on stops (cost=0.00..41218.20 rows=2060910 width=48)
-> Hash (cost=139413.45..139413.45 rows=2086645 width=268)
-> Seq Scan on master (cost=0.00..139413.45 rows=2086645 width=268)
citing_jurisdiction=1
仅排除数万行。即使有该WHERE
条款,我仍然要处理超过200万行。
硬盘使用TrueCrypt 7.1a进行了整个驱动器加密。这会使速度变慢,但不足以使查询花费那么多小时。
该WITH
零件仅需花费3分钟即可运行。
该arrest_id
字段没有外键索引。该表上有8个索引和2个外键。查询中的所有其他字段都已建立索引。
arrest_id
除了之外,该领域没有任何限制NOT NULL
。
该表共有32列。
arrest_id
类型为characteristic(20)。我知道rank()
产生一个数字值,但是我必须使用字符变化(20),因为我还有其他行citing_jurisdiction<>1
针对该字段使用非数字数据。
arrest_id
带有的所有行的字段均为空白citing_jurisdiction=1
。
这是一台个人高端笔记本电脑(截至1年前)。我是唯一的用户。没有其他查询或操作正在运行。锁定似乎不太可能。
该表中的任何地方或数据库中的其他任何地方都没有触发器。
此数据库上的其他操作不会花费大量时间。使用正确的索引,SELECT
查询通常会很快。
Seq Scan
有点吓人……