Saya memiliki tabel Postgres dengan ~ 2,1 juta baris. Saya menjalankan pembaruan di bawah ini:
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;
Permintaan ini membutuhkan waktu 39 jam untuk berjalan. Saya menjalankan ini pada prosesor laptop 4 (fisik) core i7 Q720, banyak RAM, tidak ada yang menjalankan sebagian besar waktu. Tidak ada kendala ruang HDD. Meja baru-baru ini telah disedot, dianalisis, dan diindeks ulang.
Sepanjang waktu kueri berjalan, setidaknya setelah awal WITH
selesai, penggunaan CPU biasanya rendah, dan HDD digunakan 100%. HDD digunakan sangat keras sehingga aplikasi lain berjalan jauh lebih lambat dari biasanya.
Pengaturan daya laptop berada pada kinerja tinggi (Windows 7 x64).
Inilah yang MENJELASKAN:
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
hanya mengecualikan beberapa puluh ribu baris. Bahkan dengan WHERE
klausa itu, saya masih beroperasi di lebih dari 2 juta baris.
Hard drive sepenuhnya dienkripsi dengan TrueCrypt 7.1a. Yang memperlambat segalanya sedikit, tetapi tidak cukup untuk menyebabkan query untuk mengambil yang berjam-jam.
Bagian ini WITH
hanya membutuhkan waktu sekitar 3 menit untuk dijalankan.
The arrest_id
lapangan tidak indeks untuk kunci asing. Ada 8 indeks dan 2 kunci asing di tabel ini. Semua bidang lain dalam kueri diindeks.
The arrest_id
lapangan tidak memiliki kendala kecuali NOT NULL
.
Tabel ini memiliki total 32 kolom.
arrest_id
adalah tipe karakter yang bervariasi (20) . Saya menyadari rank()
menghasilkan nilai numerik, tetapi saya harus menggunakan karakter yang bervariasi (20) karena saya memiliki baris lain di mana citing_jurisdiction<>1
yang menggunakan data non-numerik untuk bidang ini.
The arrest_id
bidang itu kosong untuk semua baris dengan citing_jurisdiction=1
.
Ini adalah laptop pribadi kelas atas (per 1 tahun yang lalu). Saya satu-satunya pengguna. Tidak ada pertanyaan atau operasi lain yang berjalan. Mengunci sepertinya tidak mungkin.
Tidak ada pemicu di mana pun dalam tabel ini atau di mana pun dalam database.
Operasi lain pada database ini tidak pernah memakan waktu lama. Dengan pengindeksan yang tepat, SELECT
permintaan biasanya cukup cepat.
Seq Scan
agak menakutkan ...