बहुत बड़े डेटाबेस फ़ाइलों के साथ sqlite की प्रदर्शन विशेषताएँ क्या हैं? [बन्द है]


325

मुझे पता है कि जब वे समर्थित होते हैं तब भी साइक्लाइट बहुत बड़ी डेटाबेस फ़ाइलों के साथ अच्छा प्रदर्शन नहीं करता है (वहाँ साइक्लाइट वेबसाइट पर एक टिप्पणी हुआ करती थी कि यदि आपको 1GB से ऊपर फ़ाइल आकार की आवश्यकता है तो आप एंटरप्राइज़ rdbms का उपयोग करने पर विचार कर सकते हैं।) 'यह अब और नहीं मिलता है, साइक्लाइट के पुराने संस्करण से संबंधित हो सकता है)।

हालाँकि, अपने उद्देश्यों के लिए मैं यह जानना चाहूंगा कि अन्य समाधानों पर विचार करने से पहले यह वास्तव में कितना बुरा है।

मैं 2GB बाद से, बहु-गीगाबाइट रेंज में sqlite डेटा फ़ाइलों के बारे में बात कर रहा हूँ। किसी के भी पास इस के साथ कोई भी अनुभव है? कोई सुझाव / विचार?


1
थ्रेडिंग (थ्रेड प्रति कनेक्शन) का उपयोग केवल पढ़ने के लिए मदद कर सकता है - stackoverflow.com/a/24029046/743263
मल्किया


23
वर्ष 2016: मेरे पास 5 जीबी डेटाबेस है जो बिना किसी समस्या के SQLite पर चलता है। मैंने Postgres पर ठीक उसी डेटासेट को स्थापित किया है। SQLite ने 2.7 ms में एक जटिल क्वेरी चलाई, 2.5 ms में पोस्टग्रेज। मैं आसान Regex पहुँच और बेहतर सूचकांक सुविधाओं के लिए Postgres पर समाप्त हुआ। लेकिन मैं SQLite से प्रभावित था और इसका इस्तेमाल भी कर सकता था।
पॉलब

जवाबों:


246

इसलिए मैंने बहुत बड़ी फ़ाइलों के लिए साइक्लाइट के साथ कुछ परीक्षण किए, और कुछ निष्कर्षों पर आया (कम से कम मेरे विशिष्ट एप्लिकेशन के लिए)।

परीक्षणों में एकल तालिका, या कई तालिकाओं के साथ एक एकल sqlite फ़ाइल शामिल है। प्रत्येक तालिका में लगभग 8 कॉलम, लगभग सभी पूर्णांक और 4 सूचकांक थे।

विचार यह था कि पर्याप्त डेटा तब तक डाला जाए जब तक कि स्क्लाइट फाइल लगभग 50GB न हो जाए।

सिंगल टेबल

मैंने सिर्फ एक तालिका के साथ एक sqlite फ़ाइल में कई पंक्तियों को सम्मिलित करने का प्रयास किया। जब फ़ाइल 7GB के बारे में थी (क्षमा करें, मैं पंक्ति गणना के बारे में विशिष्ट नहीं हो सकता) सम्मिलन बहुत लंबा हो रहा था। मैंने अनुमान लगाया था कि मेरे सभी डेटा को सम्मिलित करने के लिए मेरे परीक्षण में 24 घंटे लगेंगे, लेकिन यह 48 घंटे के बाद भी पूरा नहीं हुआ।

यह मुझे यह निष्कर्ष निकालने की ओर ले जाता है कि एकल, बहुत बड़ी साइक्लाइट तालिका में सम्मिलन के साथ मुद्दे होंगे, और शायद अन्य संचालन भी।

मुझे लगता है कि यह कोई आश्चर्य की बात नहीं है, क्योंकि तालिका बड़ी हो जाती है, सभी सूचकांकों को सम्मिलित करने और अपडेट करने में अधिक समय लगता है।

एकाधिक तालिकाओं

फिर मैंने प्रति दिन एक टेबल, कई टेबल पर डेटा को विभाजित करने की कोशिश की। मूल 1 तालिका के लिए डेटा को ~ 700 तालिकाओं में विभाजित किया गया था।

इस सेटअप को सम्मिलन के साथ कोई समस्या नहीं थी, समय बढ़ने के साथ इसमें अधिक समय नहीं लगा, क्योंकि हर दिन के लिए एक नई तालिका बनाई गई थी।

वैक्यूम मुद्दे

जैसा कि i_like_caffeine द्वारा बताया गया है, VACUUM कमांड एक समस्या है जितना बड़ा साइक्लाइट फ़ाइल है। जैसा कि अधिक आवेषण / हटाए जाते हैं, डिस्क पर फ़ाइल का विखंडन बदतर हो जाएगा, इसलिए लक्ष्य समय-समय पर VACUUM होता है जो फ़ाइल का अनुकूलन करता है और फ़ाइल स्थान को पुनर्प्राप्त करता है।

हालाँकि, जैसा कि दस्तावेज़ीकरण द्वारा बताया गया है , डेटाबेस की एक पूरी प्रतिलिपि एक वैक्यूम करने के लिए बनाई गई है , जिसे पूरा करने में बहुत लंबा समय लगता है। इसलिए, डेटाबेस जितना छोटा होगा, यह ऑपरेशन उतनी ही तेजी से खत्म होगा।

निष्कर्ष

अपने विशिष्ट एप्लिकेशन के लिए, मैं संभवतः वैक्यूम प्रदर्शन और सम्मिलन / डिलीट स्पीड दोनों का सर्वश्रेष्ठ पाने के लिए प्रति दिन एक, कई db फ़ाइलों पर डेटा को विभाजित कर रहा हूँ।

यह प्रश्नों को जटिल बनाता है, लेकिन मेरे लिए, यह इस डेटा को अनुक्रमित करने में सक्षम होने के लिए एक सार्थक ट्रेडऑफ़ है। एक अतिरिक्त लाभ यह है कि मैं केवल एक दिन के डेटा (मेरे आवेदन के लिए एक सामान्य ऑपरेशन) को छोड़ने के लिए एक पूरी db फ़ाइल को हटा सकता हूं।

मुझे शायद प्रति फ़ाइल तालिका आकार की निगरानी करनी होगी और यह देखना होगा कि गति कब समस्या बन जाएगी।

यह बहुत बुरा है कि ऑटो वैक्यूम के अलावा कोई वृद्धिशील वैक्यूम विधि नहीं लगती है । मैं इसका उपयोग नहीं कर सकता क्योंकि वैक्यूम के लिए मेरा लक्ष्य फ़ाइल को डीफ़्रैग्मेन्ट करना है (फ़ाइल स्थान कोई बड़ी बात नहीं है), जो ऑटो वैक्यूम नहीं करता है। वास्तव में, प्रलेखन में कहा गया है कि यह विखंडन को बदतर बना सकता है, इसलिए मुझे समय-समय पर फ़ाइल पर एक पूर्ण वैक्यूम का सहारा लेना पड़ता है।


5
बहुत उपयोगी जानकारी। शुद्ध अटकलें लेकिन मुझे आश्चर्य है कि अगर नए बैकअप एपीआई का उपयोग दैनिक आधार पर आपके डेटाबेस के एक गैर-खंडित संस्करण को बनाने के लिए किया जा सकता है, और एक VACUUM चलाने की आवश्यकता से बचें।
ईदोनोहो

24
मैं उत्सुक हूं, क्या लेन-देन में आपके सभी INSERTS थे?
पॉल लेफेवरे

9
हां, प्रति लेनदेन 10000 संदेशों के बैचों में आवेषण किए गए थे।
स्नैज़र 14'09

6
आपने किस फाइलसिस्टम का उपयोग किया? यदि {2,3,4} का विस्तार किया गया, तो डेटा = सेटिंग क्या थी, क्या जर्नलिंग सक्षम थी? Io पैटर्न के अलावा, जिस तरह से साइक्लाइट डिस्क में फ्लश करता है, वह महत्वपूर्ण हो सकता है।
तोबू

5
मैं मुख्य रूप से विंडोज़ पर परीक्षण कर रहा था, इसलिए लिनक्स पर व्यवहार पर टिप्पणी नहीं कर सकता।
स्नैज़र

169

हम अपने प्लेटफॉर्म पर 50 जीबी + के डीबीएस का उपयोग कर रहे हैं। कोई शिकायत महान काम नहीं करती। सुनिश्चित करें कि आप सब कुछ सही कर रहे हैं! क्या आप पूर्वनिर्धारित कथनों का उपयोग कर रहे हैं? * SQLITE 3.7.3

  1. लेन-देन
  2. पूर्व बयान दिए
  3. इन सेटिंग्स को लागू करें (आप डीबी बनाने के ठीक बाद)

    PRAGMA main.page_size = 4096;
    PRAGMA main.cache_size=10000;
    PRAGMA main.locking_mode=EXCLUSIVE;
    PRAGMA main.synchronous=NORMAL;
    PRAGMA main.journal_mode=WAL;
    PRAGMA main.cache_size=5000;
    

आशा है कि यह दूसरों की मदद करेगा, यहाँ बहुत अच्छा काम करता है


22
हाल ही में 160 जीबी रेंज में डीबीएस के साथ परीक्षण किया गया है, साथ ही साथ महान काम करता है।
स्नैज़र

10
इसके अलावा PRAGMA main.temp_store = MEMORY;
विक्रांत चौधरी

40
@ एलेक्स, दो PRAGMA main.cache_size = 5000 क्यों हैं ?;
जैक

23
बस आँख बंद करके इन अनुकूलन लागू न करें। विशेष रूप से तुल्यकालिक में = NORMAL क्रैश-सुरक्षित नहीं है। यानी, सही समय पर एक प्रक्रिया क्रैश डिस्क विफलता के अभाव में भी आपके डेटाबेस को दूषित कर सकती है। sqlite.org/pragma.html#pragma_synchronous
mpm

22
@ क्या आप उन मूल्यों और उनके बीच अंतर की व्याख्या कर सकते हैं?
4m1nh4j1

65

मैंने SQLite डेटाबेस को 3.5GB तक आकार में बनाया है जिसमें कोई ध्यान देने योग्य प्रदर्शन समस्याएँ नहीं हैं। अगर मुझे सही तरीके से याद है, तो मुझे लगता है कि SQLite2 की सीमा कुछ कम हो सकती है, लेकिन मुझे नहीं लगता कि SQLite3 में ऐसा कोई मुद्दा है।

SQLite सीमा पृष्ठ के अनुसार , प्रत्येक डेटाबेस पृष्ठ का अधिकतम आकार 32K है। और एक डेटाबेस में अधिकतम पृष्ठ 1024 ^ 3 हैं। तो मेरे गणित द्वारा जो अधिकतम आकार के रूप में 32 टेराबाइट्स के लिए निकलता है। मुझे लगता है कि SQLite मारने से पहले आप अपनी फ़ाइल सिस्टम की सीमाएं मार लेंगे!


3
8G sqlite डेटाबेस में 3000 पंक्तियों को हटाने की कोशिश करते हुए आप कौन से ऑपरेशन कर रहे हैं, इस पर निर्भर करते हुए, आपको
बेंजामिन

4
@benjaminz, आप इसे गलत कर रहे होंगे। यदि आप एक लेनदेन में 3k पंक्तियों के विलोपन को लपेटते हैं, तो यह लगभग तत्काल होना चाहिए। मेरी खुद से यह गलती थी: 10k पंक्तियों को एक-एक करके हटाने में 30 मिनट लगते थे। लेकिन एक बार जब मैंने सभी डिलीट स्टेटमेंट्स को एक ट्रांजेक्शन में लपेट लिया, तो इसमें 5s लगे।
mvp 16

55

अधिकांश कारण यह है कि आपकी आवेषण करने के लिए> 48 घंटे लग गए क्योंकि यह आपकी अनुक्रमणिका के कारण है। यह अविश्वसनीय रूप से तेज़ है:

1 - सभी अनुक्रमित 2 छोड़ें - सभी आवेषण 3 करें - फिर से अनुक्रमित बनाएं


23
यह अच्छी तरह से ज्ञात है ... लेकिन एक लंबी चलने वाली प्रक्रिया के लिए आप समय-समय पर अपने अनुक्रमितों को उनके पुनर्निर्माण के लिए नहीं छोड़ते हैं, खासकर जब आप उन्हें काम करने के लिए क्वेरी करने जा रहे हैं। यह दृष्टिकोण लिया जा रहा है, हालांकि जब स्केलेबाइट डीबी को खरोंच से फिर से बनाया जाना है, तो सभी आवेषण किए जाने के बाद अनुक्रमित बनाए जाते हैं।
स्नैज़र 28'10

24
@Snazzer एक समान स्थिति में हमने एक "संचायक" तालिका का उपयोग किया: प्रति दिन एक बार हम संचयकर्ता तालिका से एकल तालिका के भीतर मुख्य तालिका में संचित पंक्तियों को स्थानांतरित करेंगे। जहां एक दृश्य की आवश्यकता थी, दोनों तालिकाओं को एक ही तालिका के रूप में प्रस्तुत करने का ध्यान रखा गया।
CAFxX

4
एक अन्य विकल्प इंडेक्स को रखना है, लेकिन डेटा को इंडेक्स-ऑर्डर में डालने से पहले उसे छांट लें।
स्टीवन क्रिस्काला

1
@StevenKryskalla अनुक्रमणिका को छोड़ने और उन्हें फिर से बनाने की तुलना कैसे करता है? आपके द्वारा ज्ञात किसी भी लिंक को बेंचमार्क किया गया है?
mcmillab

1
@mcmillab यह साल पहले था इसलिए मुझे सभी विवरण या बेंचमार्क आँकड़े याद नहीं हैं, लेकिन सहजता से सोचकर, एन क्रमबद्ध रूप से आदेशित तत्वों को एक इंडेक्स में डालने से O (NlogN) समय लगेगा, जबकि N सॉर्ट किए गए तत्व O O (N) ले लेंगे ) समय।
स्टीवन क्रिस्कल्ला 19

34

सामान्य अनुशंसा के अलावा:

  1. थोक प्रविष्टि के लिए ड्रॉप इंडेक्स।
  2. बड़े लेनदेन में बैच आवेषण / अद्यतन।
  3. अपने बफर कैश को ट्यून करें / जर्नल को अक्षम करें / w PRAGMAs।
  4. 64 बिट मशीन का उपयोग करें (बहुत सारे कैश ™ का उपयोग करने में सक्षम होने के लिए)।
  5. [जोड़ा जुलाई २०१४] एकाधिक SQL क्वेरी चलाने के बजाय सामान्य टेबल एक्सप्रेशन (CTE) का उपयोग करें ! SQLite रिलीज 3.8.3 की आवश्यकता है।

मैंने SQLite3 के साथ अपने अनुभव से निम्नलिखित सीखा है:

  1. अधिकतम सम्मिलित गति के लिए, किसी भी स्तंभ बाधा के साथ स्कीमा का उपयोग न करें। (बाद में आवश्यकतानुसार तालिका आप अलर्ट टेबल के साथ बाधाओं को नहीं जोड़ सकते हैं)।
  2. अपनी स्कीमा को स्टोर करने के लिए ऑप्टिमाइज़ करें जो आपको चाहिए। कभी-कभी इसका मतलब डेटाबेस में डालने से पहले टेबल को तोड़ना और / या अपना डेटा कंप्रेस करना / बदलना भी होता है। एक बड़ा उदाहरण आईपी पते को (लंबे) पूर्णांक के रूप में संग्रहीत करना है।
  3. एक फ़ाइल प्रति डीबी फ़ाइल - ताला विवाद को कम करने के लिए। ( यदि आप एकल कनेक्शन ऑब्जेक्ट रखना चाहते हैं तो ATTACH DATABASE का उपयोग करें
  4. SQLite एक ही कॉलम (डायनामिक टाइपिंग) में विभिन्न प्रकार के डेटा को स्टोर कर सकता है, इसका उपयोग अपने लाभ के लिए करें।

प्रश्न / टिप्पणी का स्वागत है। ;-)


1
'एक तालिका प्रति db फ़ाइल' से आपको कितना प्रभाव मिलता है? दिलचस्प लगता है। क्या आपको लगता है कि यह बहुत मायने रखता है अगर आपकी तालिका में केवल 3 टेबल हैं और खरोंच से बनाया जा रहा है?
मार्टिन वेलेज़

4
@ स्मार्टिन इसे कहने से नफरत करता है लेकिन इसका जवाब यह निर्भर करता है । विचार डेटा को प्रबंधनीय आकार में विभाजित करता है। अपने उपयोग के मामले में मैं अलग-अलग मेजबानों से डेटा इकट्ठा करता हूं और तथ्य के बाद डेटा पर रिपोर्टिंग करता हूं इसलिए इस दृष्टिकोण ने अच्छी तरह से काम किया। दूसरों द्वारा सुझाए गए तारीख / समय के अनुसार विभाजन उस डेटा के लिए अच्छी तरह से काम करना चाहिए जिसकी लंबी अवधि मैं कल्पना करता हूं।
लेस्टर चेउंग

3
@ लेस्टर चेउंग: आपके दूसरे # 1 के बारे में: यह डॉक्स और व्यक्तिगत अनुभव से मेरी समझ है कि आज तक, SQLite3 तालिका के निर्माण के बाद ALTER TABLE के साथ बाधाओं को जोड़ने का समर्थन नहीं करता है। मौजूदा तालिका पंक्तियों से बाधाओं को जोड़ने या हटाने का एकमात्र तरीका वांछित विशेषताओं के साथ एक नई तालिका बनाना और सभी पंक्तियों पर प्रतिलिपि बनाना है, जो बाधाओं के साथ एक बार डालने की तुलना में बहुत धीमी होने की संभावना है।
Mumbleskates

3
@Widdershins आप पूर्ण रूप से सही हैं - SQLite में सारणी अवरोधों को जोड़ने की अनुमति नहीं देता है। मुझे नहीं पता कि मैं क्या धूम्रपान कर रहा था - जवाब अपडेट करूंगा - धन्यवाद।
लेस्टर चेउंग

उन सुझावों में से कोई भी विनम्र SQLite DB फ़ाइलों का उपयोग करने के साथ कुछ नहीं करना है। क्या इस उत्तर को प्रस्तुत किए जाने के बाद से प्रश्न संपादित किया गया था?
ए। रैगर

9

मुझे लगता है कि साइक्लाइट स्केलिंग के बारे में मुख्य शिकायतें हैं:

  1. एकल प्रक्रिया लिखें।
  2. कोई आईना नहीं।
  3. कोई प्रतिकृति नहीं।

9

मेरे पास 7GB का SQLite डेटाबेस है। किसी विशेष क्वेरी को इनर जॉइन करने के लिए 2.6s लगते हैं। इसे गति देने के लिए मैंने इंडेक्स जोड़ने की कोशिश की। किस सूचकांक (तों) के आधार पर, कभी-कभी क्वेरी 0.1% तक नीचे चली गई और कभी-कभी यह यूपी के रूप में 7 से अधिक हो गई। मुझे लगता है कि मेरे मामले में समस्या यह थी कि यदि कोई कॉलम अत्यधिक डुप्लिकेट है, तो एक सूचकांक में गिरावट प्रदर्शन को बढ़ाती है :(


9
कई डुप्लिकेट के साथ एक स्तंभ प्रदर्शन (गंभीर प्रश्न) को नीचा क्यों करेगा?
मार्टिन वेलेज़

6
कम हृदयता वाला एक स्तंभ अनुक्रमणिका के लिए कठिन है: stackoverflow.com/questions/2113181/…
मेट्रिक्स

9

SQLite प्रलेखन में एक कथन हुआ करता था कि डेटाबेस फ़ाइल की व्यावहारिक आकार सीमा कुछ दर्जन GB: s थी। जब भी आपने लेन-देन शुरू किया था, तो ज्यादातर SQLite की जरूरत थी "गंदे पन्नों का एक बिटमैप आवंटित करने के लिए"। इस प्रकार डेटाबेस में प्रत्येक MB के लिए 256 बाइट RAM की आवश्यकता थी। 50 GB DB-फ़ाइल में डालने पर एक भारी (2 ^ 8) * (2 ^ 10) = 2 ^ 18 = 256 MB RAM की आवश्यकता होगी।

लेकिन SQLite के हाल के संस्करणों के रूप में, यह अब जरूरत नहीं है। और अधिक पढ़ें यहाँ


25
मुझे बहुत खेद है कि मुझे इसे इंगित करना है, लेकिन 2^18वास्तव में केवल 256 K. है
गेब्रियल श्रेइबर

7
@GabrielSchreiber कि, और यह भी तथ्य यह है कि 50GB नहीं है (2 ^ 10) एमबी, यह केवल 1GB है। तो एक 50GB डेटाबेस के लिए, आपको 12.5MB मेमोरी चाहिए: (2 ^ 8) * (2 ^ 10) * 50
elipoultorak

8

वैक्यूम कमांड का उपयोग करते समय मैंने बड़ी साइक्लाइट फ़ाइलों के साथ समस्याओं का अनुभव किया है।

मैंने अभी तक auto_vacUM सुविधा की कोशिश नहीं की है। यदि आप अक्सर डेटा को अपडेट करने और हटाने की अपेक्षा करते हैं तो यह देखने लायक है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.