दिलचस्प पोस्ट
जावा में उदाहरण (क्लास <?> सी) की तरह कुछ है? विकल्प के साथ अनंत लूप सीटीई (अधिकतम क्रैकशन 0) I = 0 के लिए, क्यों (i + = i ++) 0 के बराबर है? क्या 0 का एक HTTP स्थिति कोड का कोई अर्थ है? प्रतिक्रिया / जेएसएक्स गतिशील घटक नाम अन्य नामस्थानों से वस्तुओं का उपयोग कैसे करें और PHP में नामस्थान कैसे आयात करें जावा में, मैं एक्सएमएल को फ़ाइल के बजाय स्ट्रिंग के रूप में कैसे पार्स कर सकता हूं? संबंधित मूल्यों के साथ स्विफ्ट एन्हियम की समानता का परीक्षण कैसे करें क्या यह एक सेटर रिटर्न "यह" करने के लिए बुरा अभ्यास है? गैर-निरंतर चर के साथ सरणी आकार को घोषित करना मेरी कस्टम छवि के साथ फेसबुक लॉगइन बटन को कैसे बदला जाए पृष्ठभूमि धागा को तेजी से कैसे उपयोग करें? प्रिंट स्टेटमेंट का उपयोग करके वीएआरएआरएआर (मैक्स) कैसे मुद्रित करें? आइडिया में टॉमकेट युद्ध विस्फोट: सर्वर कनेक्ट नहीं है तैनाती उपलब्ध नहीं है मैं अपना MySQL उपयोगकर्ता नाम और पासवर्ड कैसे प्राप्त करूं?

पोस्टग्रेज़ में बल्क डालने का सबसे तेज़ तरीका क्या है?

मुझे प्रोग्राम के 10 लाखों रिकॉर्ड पोस्टग्रेज़ डेटाबेस में शामिल करने की ज़रूरत है वर्तमान में मैं एक एकल "क्वेरी" में 1000 सम्मिलित स्टेटमेंट निष्पादित कर रहा हूं।

क्या ऐसा करने का एक बेहतर तरीका है, कुछ बल्क डालने के वक्तव्य के बारे में मुझे पता नहीं है?

वेब के समाधान से एकत्रित समाधान "पोस्टग्रेज़ में बल्क डालने का सबसे तेज़ तरीका क्या है?"

पोस्टग्रेएसक्यूएल में एक गाइड है जिस पर सबसे पहले एक डाटाबेस को पॉप्युलेट करना है, और वे थोक लोडिंग पंक्तियों के लिए कॉप्पी कमांड का उपयोग करने का सुझाव देते हैं। मार्गदर्शिका में कुछ अन्य अच्छी युक्तियां हैं जो प्रक्रिया को गति देने के लिए, डेटा लोड करने से पहले इंडेक्स और विदेशी कुंजी को हटाने जैसे (और बाद में उन्हें जोड़ना)।

कॉप्पी का उपयोग करने के लिए एक विकल्प है, जो कि पोस्टरगार्स का समर्थन करता है। प्रलेखन से :

INSERT INTO films (code, title, did, date_prod, kind) VALUES ('B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'), ('HG120', 'The Dinner Game', 140, DEFAULT, 'Comedy'); 

उपरोक्त कोड दो पंक्तियों को सम्मिलित करता है, लेकिन आप इसे मनमाने ढंग से विस्तारित कर सकते हैं, जब तक आप तैयार कतारों की अधिकतम संख्या (यह $ 99 9 हो, लेकिन मैं उस बारे में 100% निश्चित नहीं हो) को दबाए। कभी-कभी कोई भी COPY का उपयोग नहीं कर सकता, और यह उन स्थितियों के लिए एक योग्य प्रतिस्थापन है

चीजों को गति देने का एक तरीका स्पष्ट रूप से एकाधिक सम्मिलन या प्रति लेन-देन के भीतर कॉपी करना है (1000 कहते हैं)। पोस्टग्रेज़ का डिफ़ॉल्ट व्यवहार प्रत्येक वक्तव्य के बाद करना है, इसलिए कमेट्स को बैचिंग करके, आप कुछ ओवरहेड से बच सकते हैं। जैसा कि डैनियल के उत्तर में दिशानिर्देश में कहा गया है, आपको इसके लिए कार्य करने के लिए स्वत: निमंत्रण को अक्षम करना पड़ सकता है। इसके अलावा, नीचे दिए गए टिप्पणी को नोट करें जो wal_buffers के आकार को 16 एमबी तक बढ़ाने का सुझाव दे सकता है।

यह ज्यादातर डेटाबेस में (अन्य) गतिविधि पर निर्भर करता है। इस तरह से संचालन अन्य सत्रों के लिए संपूर्ण डेटाबेस को प्रभावी ढंग से फ्रीज करता है एक और विचार है डेटामोडेल और बाधाओं, ट्रिगर आदि की उपस्थिति।

मेरा पहला दृष्टिकोण हमेशा होता है: लक्ष्य तालिका के समान एक संरचना के साथ एक (अस्थायी) तालिका बनाएं (तालिका = tmp के रूप में चुनें * जहां से लक्ष्य = 1), और फ़ाइल को अस्थायी तालिका में पढ़कर शुरू करें। तब मैं जांचता हूं कि क्या जांच की जा सकती है: डुप्लिकेट, कुंजी जो पहले से ही लक्ष्य में मौजूद हैं, आदि।

तो मैं सिर्फ एक "टीएमपी से * चुनने के लिए लक्ष्य में सम्मिलित करता हूं" या समान।

यदि यह असफल हो जाता है, या बहुत समय लगता है, तो मैं इसे रद्द कर दूंगा और अन्य तरीकों पर विचार करेगी (अस्थायी रूप से अनुक्रमित / बाधाएं आदि)

आप COPY table TO ... WITH BINARY उपयोग कर सकते हैं COPY table TO ... WITH BINARY जो " पाठ और सीएसवी स्वरूपों से कुछ हद तक तेज है ।" केवल ऐसा करें यदि आपके पास डालने के लिए लाखों पंक्तियां हैं, और यदि आप द्विआधारी डेटा के साथ सहज हैं

यहां Python में उदाहरण नुस्खा है, बाइंडिक इनपुट के साथ psycopg2 का उपयोग करते हुए ।

सरणियों के साथ UNNEST फ़ंक्शन multirow VALUES वाक्यविन्यास के साथ प्रयोग किया जा सकता है। मुझे लगता है कि यह विधि COPY का उपयोग करने से धीमी है, लेकिन यह psycopg और python ( cursor.execute list पारित की गई अजगर list पीजी cursor.execute ) के साथ काम करने में मेरे लिए उपयोगी है:

 INSERT INTO tablename (fieldname1, fieldname2, fieldname3) VALUES ( UNNEST(ARRAY[1, 2, 3]), UNNEST(ARRAY[100, 200, 300]), UNNEST(ARRAY['a', 'b', 'c']) ); 

अतिरिक्त अस्थिरता जांच के साथ उप-चयन का उपयोग करते हुए VALUES बिना:

 INSERT INTO tablename (fieldname1, fieldname2, fieldname3) SELECT * FROM ( SELECT UNNEST(ARRAY[1, 2, 3]), UNNEST(ARRAY[100, 200, 300]), UNNEST(ARRAY['a', 'b', 'c']) ) AS temptable WHERE NOT EXISTS ( SELECT 1 FROM tablename tt WHERE tt.fieldname1=temptable.fieldname1 ); 

थोक अद्यतनों के लिए एक ही वाक्यविन्यास:

 UPDATE tablename SET fieldname1=temptable.data FROM ( SELECT UNNEST(ARRAY[1,2]) AS id, UNNEST(ARRAY['a', 'b']) AS data ) AS temptable WHERE tablename.id=temptable.id; 

मैंने देशी लिपीपीक विधियों के साथ बहुत तेजी से पोस्टग्रेसेक डेटा लोडर कार्यान्वित किया है। मेरे पैकेज का प्रयास करें https://www.nuget.org/packages/NpgsqlBulkCopy/

मुझे इस मुद्दे का सामना करना पड़ा और पोस्ट्ग्रेज़ में थोक आयात के लिए सीएसवीएसक्यूएल की सिफारिश की जाएगी । एक थोक प्रविष्टि करने के लिए आप बस csvsql और फिर csvsql उपयोग csvsql , जो आपके डेटाबेस से कनेक्ट होता है और csvsql के एक संपूर्ण फ़ोल्डर के लिए व्यक्तिगत तालिकाओं बनाता है

 $ createdb test $ csvsql --db postgresql:///test --insert examples/*.csv