2010-08-09 9 views
9

मेरे पास एक डेटा संरचना है जो इस तरह दिखती है:PostgreSQL को डेटा के * विशाल * भाग कैसे आयात करें?

Model Place 
    primary key "id" 

    foreign key "parent" -> Place 
    foreign key "neighbor" -> Place (symmetryc) 
    foreign key "belongtos" -> Place (asymmetric) 

    a bunch of scalar fields ... 

मेरे पास मॉडल तालिका में 5 मिलियन से अधिक पंक्तियां हैं, और मुझे दो विदेशी कुंजी तालिकाओं में से प्रत्येक में ~ 50 मिलियन पंक्तियां डालने की आवश्यकता है। मेरे पास SQL फ़ाइलें हैं जो इस तरह दिखती हैं:

INSERT INTO place_belongtos (from_place_id, to_place_id) VALUES (123, 456); 

और वे 7 जीबी प्रत्येक के बारे में हैं। समस्या यह है कि, जब मैं psql < belongtos.sql करता हूं, तो मुझे अपने एएमडी Turion64x2 CPU पर ~ 4 मिलियन पंक्तियों को आयात करने के लिए 12 घंटे के बारे में लगता है। ओएस Gent Gent ~ amd64 है, PostgreSQL संस्करण 8.4 है, स्थानीय रूप से संकलित। डेटा डीआईआर एक बाध्य माउंट है, जो मेरे दूसरे विस्तारित विभाजन (ext4) पर स्थित है, जो मुझे विश्वास है कि बाधा नहीं है।

मुझे संदेह है कि विदेशी कुंजी संबंधों को सम्मिलित करने में इतना समय लगता है क्योंकि psql प्रत्येक पंक्ति के लिए मुख्य बाधाओं के लिए जांच करता है, जो शायद कुछ अनावश्यक ओवरहेड जोड़ता है, क्योंकि मुझे पता है कि डेटा मान्य है। क्या आयात को तेज करने का कोई तरीका है, यानी अस्थायी रूप से बाधा जांच को अक्षम कर रहा है?

+0

हाँ, लेकिन मुझे लगता है कि यह केवल 8.4+ हम्म में है इसे देखना है .... – xenoterracide

उत्तर

16
  1. सुनिश्चित करें कि दोनों विदेशी कुंजी की कमी DEFERRABLE
  2. उपयोग COPY हैं
  3. आप कॉपी उपयोग नहीं कर सकते हैं, तो अपने निवेशन के लिए prepared statement का उपयोग अपने डेटा लोड करने के लिए सुनिश्चित करें।
  4. उचित कॉन्फ़िगरेशन सेटिंग्स भी मदद करेंगे, WAL सेटिंग्स की जांच करें।
+4

सीओपीवाई के लिए +1, उस डालने वाले टन में चलने वाले डीबी पर एक बड़ा अंतर बनाता है डेटा नियमित रूप से ... – Ryley

+0

मैं पहले से ही डिफ्रैबल का उपयोग करता हूं। कॉपी वह चीज है जिसे मैं ढूंढ रहा था, धन्यवाद! –

+0

डिफ्रैबल का उपयोग करना एक बात है, इस विकल्प का उपयोग करके वास्तव में एक और बात है: अनिवार्य रूप से डिफर्ड या सेट कन्स्ट्रैंट्स सभी डिफ्रेंड; –

0

उत्तर हाँ है ... Depesz wrote an article here on deferrable uniqueness। दुर्भाग्य से यह 9.0 फीचर लगता है।

हम्म ... शायद वह लेख आपकी स्थिति पर लागू नहीं होता है? ऐसा लगता है कि हम थोड़ी देर के लिए set constraints to deferred कर पाए हैं ... मुझे लगता है कि अनूठा एक अद्वितीय स्थिति है (पन इरादा)।

+0

विदेशी कुंजी पहले से ही पुराने संस्करणों में अव्यवस्थित हैं, कोई समस्या नहीं है। –

+0

अरे, हर दिन कुछ नया सीखें;)। – xenoterracide

+0

डेपेज के आलेख में * अद्वितीय * बाधाओं (उदा। प्राथमिक कुंजी) को डिफ्रैरबल करने का वर्णन किया गया है जो 9.0 से पहले स्थगित नहीं थे। अद्यतन आईडी = आईडी + 1 चलाने के लिए (जहां आईडी एक पीके कॉलम है) नियमित एफके बाधाओं को "हमेशा" स्थगित कर दिया गया है। अवरोध करने के लिए बाधा सेट करना जांच को रोक नहीं पाएगा, यह केवल लेनदेन के अंत तक जांचने के लिए _delay_ होगा (यानी जब प्रतिबद्धता निष्पादित की जाती है) –

संबंधित मुद्दे