Tôi có một bảng Postgres với ~ 2,1 triệu hàng. Tôi đã chạy bản cập nhật dưới đây về nó:
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;
Truy vấn này mất 39 giờ để chạy. Tôi đang chạy cái này trên bộ vi xử lý laptop i7 Q720 lõi 4 (vật lý), nhiều RAM, không có gì khác chạy trong phần lớn thời gian. Không hạn chế dung lượng ổ cứng. Bảng gần đây đã được hút bụi, phân tích và reindexed.
Toàn bộ thời gian truy vấn đang chạy, ít nhất là sau khi WITH
hoàn thành ban đầu , mức sử dụng CPU thường thấp và ổ cứng được sử dụng 100%. Ổ cứng đã được sử dụng quá mạnh đến nỗi bất kỳ ứng dụng nào khác chạy chậm hơn đáng kể so với bình thường.
Cài đặt nguồn của máy tính xách tay là hiệu năng cao (Windows 7 x64).
Đây là GIẢI THÍCH:
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
chỉ loại trừ một vài chục ngàn hàng. Ngay cả với WHERE
điều khoản đó , tôi vẫn hoạt động trên hơn 2 triệu hàng.
Ổ cứng được mã hóa toàn bộ ổ đĩa bằng TrueCrypt 7.1a. Làm chậm điều xuống một chút, nhưng không đủ để gây ra một truy vấn để lấy đó nhiều giờ.
Phần WITH
chỉ mất khoảng 3 phút để chạy.
Trường arrest_id
không có chỉ số cho khóa ngoại. Có 8 chỉ mục và 2 khóa ngoại trên bảng này. Tất cả các trường khác trong truy vấn được lập chỉ mục.
Trường arrest_id
không có ràng buộc ngoại trừ NOT NULL
.
Bảng có tổng số 32 cột.
arrest_id
là loại ký tự khác nhau (20) . Tôi nhận ra việc rank()
tạo ra một giá trị số, nhưng tôi phải sử dụng thay đổi ký tự (20) vì tôi có các hàng khác citing_jurisdiction<>1
sử dụng dữ liệu không phải là số cho trường này.
Trường arrest_id
trống cho tất cả các hàng với citing_jurisdiction=1
.
Đây là một máy tính xách tay cá nhân, cao cấp (tính đến 1 năm trước). Tôi là người dùng duy nhất. Không có truy vấn hoặc hoạt động khác đang chạy. Khóa dường như không thể.
Không có kích hoạt bất cứ nơi nào trong bảng này hoặc bất cứ nơi nào khác trong cơ sở dữ liệu.
Các hoạt động khác trên cơ sở dữ liệu này không bao giờ mất nhiều thời gian. Với việc lập chỉ mục thích hợp, SELECT
các truy vấn thường khá nhanh.
Seq Scan
là một chút đáng sợ ...