मेरे पास ~ 2.1 मिलियन पंक्तियों के साथ एक पोस्टग्रैज टेबल है। मैंने इस पर नीचे का अद्यतन चलाया:
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 लैपटॉप प्रोसेसर पर चला रहा हूं, बहुत सारे रैम, और कुछ नहीं, अधिकांश समय चल रहा है। कोई HDD स्पेस की कमी नहीं। तालिका को हाल ही में वैक्यूम किया गया था, विश्लेषण किया गया था और फिर से जोड़ा गया था।
पूरे समय क्वेरी चल रही थी, कम से कम प्रारंभिक WITH
पूरा होने के बाद , सीपीयू का उपयोग आमतौर पर कम था, और एचडीडी 100% उपयोग में था। एचडीडी को इतनी मेहनत से इस्तेमाल किया जा रहा था कि कोई भी अन्य ऐप सामान्य की तुलना में बहुत धीरे-धीरे चलता था।
लैपटॉप की पावर सेटिंग उच्च प्रदर्शन (विंडोज 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
थोड़े डरावने हैं ...