~ 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, 대부분의 시간 동안 달리는 아무것도 실행하지 않습니다. HDD 공간 제약이 없습니다. 최근에 테이블을 진공 청소기, 분석 및 재 색인했습니다.
쿼리가 실행되는 전체 시간, 적어도 초기 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조항을 사용 하더라도 여전히 2 백만 행 이상을 운영하고 있습니다.
하드 드라이브는 TrueCrypt 7.1a로 전체 드라이브 암호화됩니다. 충분히 그 감속의 조금 아래 것들,하지만 쿼리가 수행하게하기 위해 그 많은 시간을.
이 WITH부품은 실행하는 데 약 3 분이 걸립니다.
arrest_id필드는 외부 키 인덱스 없었다. 이 테이블에는 8 개의 인덱스와 2 개의 외래 키가 있습니다. 쿼리의 다른 모든 필드는 색인화됩니다.
이 arrest_id필드에는를 제외한 제약 조건이 없습니다 NOT NULL.
테이블에는 총 32 개의 열이 있습니다.
arrest_id문자 가변 (20) 유형 입니다. rank()숫자 값을 생성 한다는 것을 알고 있지만 이 필드에 숫자가 아닌 데이터를 사용하는 다른 행이 있기 때문에 문자 가변 (20)citing_jurisdiction<>1 을 사용해야합니다.
이 ( arrest_id가)있는 모든 행 의 입력란이 비어 citing_jurisdiction=1있습니다.
개인용 고급형 노트북입니다 (1 년 전). 나는 유일한 사용자입니다. 다른 쿼리 나 작업이 실행되지 않았습니다. 잠그는 것 같지 않습니다.
이 테이블 또는 데이터베이스의 어느 위치에도 트리거가 없습니다.
이 데이터베이스의 다른 작업에는 시간이 걸리지 않습니다. 적절한 인덱싱을 사용하면 SELECT일반적으로 쿼리가 매우 빠릅니다.
Seq Scan조금 무서운 ...입니다