~ 2.1 milyon sıralı bir Postgres masam var. Üzerinde aşağıdaki güncellemeyi çalıştırdım:
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;
Bu sorgunun çalışması 39 saat sürdü. Ben 4 (fiziksel) core i7 Q720 dizüstü bilgisayar işlemcisi, bol RAM, zamanın büyük çoğunluğunu çalıştıran başka bir şey üzerinde çalışıyorum. HDD alan kısıtlaması yok. Masa yakın zamanda vakumlanmış, analiz edilmiş ve yeniden endekslenmiştir.
Sorgunun çalıştığı süre boyunca, en azından ilk WITHtamamlandıktan sonra , CPU kullanımı genellikle düşüktü ve HDD% 100 kullanımdaydı. HDD o kadar sert kullanılıyordu ki diğer uygulamalar normalden çok daha yavaş çalışıyordu.
Dizüstü bilgisayarın güç ayarı Yüksek performanstaydı (Windows 7 x64).
İşte EXPLAIN:
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=1yalnızca on binlerce satırı hariç tutar. Bu WHEREmaddede bile , hala 2 milyondan fazla satır üzerinde çalışıyorum.
Sabit sürücü TrueCrypt 7.1a ile tümüyle şifrelenmiştir. Yeterince Yani yavaşlatır biraz aşağı şeyler ama bir sorgu almaya neden olduğu uzun saatler.
WITHKısmı sadece çalıştırmak için 3 dakika sürer.
arrest_idAlan yabancı anahtar için hiçbir indeksi vardı. Bu tabloda 8 dizin ve 2 yabancı anahtar vardır. Sorgudaki diğer tüm alanlar dizine eklenir.
arrest_idAlan dışında herhangi bir sınırlama olmaması NOT NULL.
Tabloda toplam 32 sütun vardır.
arrest_idkarakter tipindedir (20) . Ben rank()sayısal bir değer üretir, ancak bu alan için sayısal olmayan veri kullanan başka satırları var çünkü ben karakter değişen (20) kullanmak zorunda farkında citing_jurisdiction<>1.
arrest_idAlan ile tüm satırlar için boş oldu citing_jurisdiction=1.
Bu kişisel, üst seviye (1 yıl önce) bir dizüstü bilgisayar. Tek kullanıcı benim. Başka sorgu veya işlem yürütülmüyordu. Kilitleme pek olası görünmüyor.
Bu tablonun herhangi bir yerinde veya veritabanında başka hiçbir yerde tetikleyici yoktur.
Bu veritabanındaki diğer işlemler hiçbir zaman anormal bir zaman almaz. Doğru indeksleme ile SELECTsorgular genellikle oldukça hızlıdır.
Seq Scanbiraz korkutucu ...