2013-09-02 6 views
27

क्या डेटा लोड होने के बाद एक इंडेक्स बनाने के लिए और अधिक कुशल है या इससे कोई फर्क नहीं पड़ता?पोस्टग्रेज़ में एक इंडेक्स बनाने का सबसे प्रभावी तरीका

उदाहरण के लिए, मेरे पास पोस्टग्रेस 8.4 डीबी में लोड करने के लिए 500 फाइलें हैं। यहां दो इंडेक्स निर्माण परिदृश्य हैं जिनका उपयोग मैं कर सकता हूं:

  1. तालिका बनाते समय अनुक्रमणिका बनाएं, फिर प्रत्येक फ़ाइल को तालिका में लोड करें; या
  2. तालिका में सभी फ़ाइलों को लोड करने के बाद अनुक्रमणिका बनाएं।

तालिका डेटा स्वयं लगभग 45 गीगाबाइट है। सूचकांक लगभग 12 गीगाबाइट है। मैं एक मानक सूचकांक का उपयोग कर रहा हूँ। यह इस तरह बनाया गया है:

CREATE INDEX idx_name ON table_name (column_name); 

मेरा डेटा लोडिंग COPY FROM का उपयोग करता है।

एक बार सभी फाइलें लोड हो जाने के बाद, तालिका पर कोई अपडेट, डिलीट या अतिरिक्त भार नहीं होगा (यह एक दिन का डेटा है जो बदलेगा नहीं)। तो मैं पूछना चाहता था कि कौन सा परिदृश्य सबसे कुशल होगा? प्रारंभिक परीक्षण इंगित करता है कि सभी फाइलें लोड करना और फिर इंडेक्स (परिदृश्य 2) बनाना तेजी से है, लेकिन मैंने दो दृष्टिकोणों की वैज्ञानिक तुलना नहीं की है।

उत्तर

43

आपका अवलोकन सही है - यह पहले डेटा लोड करने के लिए और अधिक प्रभावी है और केवल अनुक्रमणिका बनाते हैं। इसका कारण यह है कि सम्मिलित होने के दौरान इंडेक्स अपडेट महंगा हैं। यदि आप सभी डेटा के बाद इंडेक्स बनाते हैं, तो यह बहुत तेज़ है।

यह आगे भी जाता है - यदि आपको मौजूदा अनुक्रमित तालिका में बड़ी मात्रा में डेटा आयात करने की आवश्यकता है, तो पहले मौजूदा इंडेक्स को छोड़ना, डेटा आयात करना और फिर फिर से अनुक्रमणिका बनाना फिर से अधिक प्रभावी होता है।

आयात करने के बाद सूचकांक बनाने का एक नकारात्मक पक्ष यह है कि तालिका को लॉक किया जाना चाहिए, और इसमें लंबा समय लग सकता है (यह विपरीत परिदृश्य में बंद नहीं होगा)। लेकिन, PostgreSQL 8.2 और बाद में, आप CREATE INDEX CONCURRENTLY का उपयोग कर सकते हैं, जो अनुक्रमण के दौरान तालिका को लॉक नहीं करता है (कुछ चेतावनियों के साथ)।

+0

ठीक है, जब टेबल लॉक हो जाती है कोई भी पढ़ या लिख ​​सकता है, जो रात में भी बहुत परेशान हो सकता है। CREATE INDEX CONCURRENTLY – mvp

+0

@BradTilley का उपयोग करके आप बेहतर हैं: मैंने सोचा कि यह नई सुविधा थी, लेकिन PostgreSQL 8.4 [इसका समर्थन करता है] (http://www.postgresql.org/docs/8.4/static/sql-createindex.html)। – mvp

+4

"* जब टेबल लॉक हो जाता है कोई भी पढ़ या लिख ​​सकता है *" - मुझे नहीं लगता कि यह सच है। जब 'CREATE INDEX' चल रहा है, तब भी तालिका पढ़ी जा सकती है, लेकिन अगर मैं गलत नहीं हूं तो अपडेट नहीं किया गया है। –

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