2012-03-12 16 views
6

इस प्रश्न को डुप्लिकेट के रूप में चिह्नित करने से पहले, कृपया मुझे सुनें !!
मैंने पहले से ही प्रश्नों को बेहतर तरीके से पढ़ा है कि प्रदर्शन में सुधार कैसे करें। बस कुछ Improve INSERT-per-second performance of SQLite? और What are the performance characteristics of sqlite with very large database files?SQLite: व्यावहारिक सीमाएं क्या हैं?

का उल्लेख करने के लिए मैं 5 गीगाबाइट्स के डेटाबेस फ़ाइल आकार के साथ स्क्लाइट काम करने के लिए संघर्ष कर रहा हूं। इसके विपरीत वहां लोग हैं, जो दावा करते हैं कि स्क्लाइट उनके लिए 'महान' काम करता है, भले ही डेटाबेस का आकार 160 जीबी जितना बड़ा हो। मैंने इसे स्वयं नहीं किया है लेकिन पूछे गए प्रश्नों से, मुझे लगता है कि सभी बेंच-मार्किंग शायद डेटाबेस में केवल तालिका के साथ किया जाता है। 20 या टेबल
- -

मैं
के साथ एक डेटाबेस का उपयोग कर रहा तालिकाओं में से आधे से अधिक 15 कॉलम
है - इन 15 या तो स्तंभ-टेबल से प्रत्येक 6/7 विदेशी कुंजी है कॉलम - इन तालिकाओं में से कुछ पहले से ही एक महीने में 27 मिलियन रिकॉर्ड हो चुके हैं

मैं जिस विकास मशीन का उपयोग कर रहा हूं वह 3 गीगाहर्ट्ज क्वाड कोर मशीन है जिसमें 4 गीगा रैम है और फिर भी इसमें 3 मिनट से अधिक समय लगता है बस इन बड़ी तालिकाओं में row_count पूछने के लिए।

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

तो मेरे प्रश्न
ए) क्या मैं नौकरी के लिए गलत डेटाबेस का उपयोग कर रहा हूं?
बी) आपको क्या लगता है कि मैं गलत कहां जा रहा हूं?
सी) मैंने अभी तक विदेशी कुंजी पर इंडेक्स नहीं जोड़े हैं, लेकिन यदि केवल पंक्ति गणना क्वेरी में चार मिनट लगते हैं तो विदेशी कुंजी की अनुक्रमणिका मुझे कैसे मदद करती हैं?

संपादित भले ही कोई भी कहा है कि और अधिक जानकारी प्रदान करने के लिए यह हों :) मैं SQLite संस्करण 3.7.9 का उपयोग कर रहा system.data.sqlite.dll संस्करण 1.0.77.0

EDIT2 साथ: मुझे लगता है कि जहां मैं 160 गीग लोगों से अलग जा रहा हूं वह यह है कि वे एक व्यक्तिगत रिकॉर्ड या रिकॉर्ड की एक छोटी सी श्रृंखला का चयन कर सकते हैं। लेकिन मुझे अपनी तालिका में सभी 27 लाख पंक्तियों को लोड करना होगा, उन्हें अन्य तालिकाओं के साथ शामिल करना होगा, उपयोगकर्ता द्वारा पूछे गए रिकॉर्ड को समूहित करना होगा और परिणामों को वापस करना होगा। ऐसे परिणामों के लिए डेटाबेस को अनुकूलित करने का सबसे अच्छा तरीका क्या है इस पर कोई इनपुट।

मैं पिछले प्रश्न के परिणामों को कैश नहीं कर सकता क्योंकि यह मेरे मामले में समझ में नहीं आता है। कैश को मारने की संभावना काफी कम होगी।

+2

यदि अन्य लोग कह रहे हैं कि 160 जीबी डेटाबेस ठीक चलते हैं, तो स्पष्ट रूप से यह कुछ ऐसा होना चाहिए जो आप कर रहे हैं, लेकिन आप हमें नहीं बता रहे हैं कि आप कैसे कर रहे हैं, यह कहकर कि आपके पास विदेशी पर कोई अनुक्रमणिका नहीं है चांबियाँ। क्या आपने * विदेशी कुंजी को अनुक्रमणित करने की कोशिश की है? –

+0

पूछे गए प्रश्नों के अनुसार मुझे लगता है कि 160 जीबी डेटाबेस केवल एक टेबल का उपयोग कर रहे थे। नहीं, मैंने अभी तक विदेशी कुंजी पर इंडेक्स नहीं जोड़े हैं, क्योंकि जब भी मैं एक क्वेरी चलाता हूं जहां विदेशी कुंजी शामिल नहीं हैं यानी 'कुछ_table से गिनती (*) का चयन करें, sqlite को इस क्वेरी के परिणाम को वापस करने में कुछ मिनट लगते हैं। मैं विदेशी कुंजी में इंडेक्स जोड़ूंगा और वापस आऊंगा। कृपया मुझे बताएं कि आप और जानना चाहेंगे। – WPFAbsoluteNewBie

+0

क्या आपके पास टेबल पर इंडेक्स हैं? –

उत्तर

4

यहां पर विचार करने के लिए बहुत कुछ है, लेकिन मेरी पहली सलाह सलाह चेहरा मूल्य पर अन्य के प्रदर्शन आंकड़े नहीं लेनी होगी। डाटाबेस प्रदर्शन कई चीजों पर निर्भर करता है, जिसमें आपका डेटाबेस कैसे संरचित है, आपके प्रश्नों की जटिलता, जो इंडेक्स आपने परिभाषित किया है (या नहीं), और अक्सर उनमें डेटा की बहुत अधिक मात्रा होती है। बहुत से रिपोर्ट किए गए प्रदर्शन संख्या बहुत सारे परीक्षण और त्रुटि से आती हैं, और/या डेटाबेस से मेल खाते में मेल खाते हैं। इसे एक और तरीके से कहने के लिए, जो भी प्रदर्शन आप किसी भी डीबीएमएस से प्राप्त करने जा रहे हैं, उसे स्पष्ट रूप से किसी अन्य एप्लिकेशन के प्रदर्शन से तुलना नहीं किया जा सकता है जब तक कि आपके डेटासेट और संरचनाएं समान न हों - वे निश्चित रूप से एक मार्गदर्शिका हैं, और शायद प्रयास करने के लिए एक आदर्श , लेकिन आप बॉक्स के बाहर "पागल प्रदर्शन पाने के लिए जरूरी नहीं हैं।"

मैं एक शुरुआती बिंदु के रूप में, उन शुरुआती बिंदुओं के रूप में डेटा को अनुक्रमणित करना शुरू कर दूंगा (टिप्पणियों से, आपको यह मिल गया है), और देखें कि क्या होता है। माना जाता है कि चार मिनट लगने वाली गिनती है एक बहुत लंबे समय है, लेकिन यहीं रुक न। कुछ अनुक्रमित जोड़े, उनके आसपास बदलने के लिए, आप डेटा है कि आप स्टोर करने के लिए की जरूरत नहीं है भंडारण कर रहे हैं तो पूछते हैं, और अन्य डेटाबेस प्रश्नों, न सिर्फ गिनती क्वेरी, के लिए देखो । न्यायाधीश प्रदर्शन अन्य एप्लिकेशन और ब्लॉग पोस्ट है कि पंक्तियों की बड़ी संख्या के लिए SQLite का उपयोग के लिए देखो, और देखें कि वे क्या यह (जो बदलते डेटाबेस शामिल हो सकते हैं) मूल रूप से, सामान की कोशिश संबोधित करने के लिए किया है -। और फिर एक निर्णय करना। मत प्रारंभिक डर आप बंद करो, यह सोच कर कि आप नीचे गलत पथ जा रहे हैं। हो सकता है कि आप कर रहे हैं, हो सकता है आप नहीं कर रहे हैं, लेकिन सिर्फ COUNT क्वेरी के साथ बंद नहीं करते। कोई w अरे आप इसे टुकड़ा करते हैं, एक टेबल में 27 मिलियन रिकॉर्ड एक बकवास टन है।

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

+0

क्या आप कृपया बता सकते हैं कि तालिका को टुकड़ा करके आपका क्या मतलब है? जहां तक ​​मुझे पता है कि स्क्लाइट किसी भी क्षैतिज विभाजन का स्वाभाविक रूप से समर्थन नहीं करता है। – WPFAbsoluteNewBie

+0

मैं डेटाबेस का जिक्र नहीं कर रहा था, यह सिर्फ भाषण का एक आंकड़ा है। जब मैं कहता हूं "किसी भी तरह से ** ** स्लाइस ** [यह समस्या] ..." मेरा मतलब है "किसी भी तरह से ** ** ** इस समस्या से, तालिका में 27 मिलियन रिकॉर्ड बहुत हैं।" – jefflunt

0

चयन गिनती (*) SQLite में हमेशा से जब अन्य DMBS की तुलना में धीमी हो जाएगा, क्योंकि यह है कि विशेष अनुरोध के लिए एक मेज स्कैन करता है। इसमें मदद करने के लिए एक सांख्यिकीय तालिका नहीं है। इसका मतलब यह नहीं है कि आपके आवेदन प्रश्न धीमे हो जाएंगे। वास्तव में यह बताने के लिए कि आप क्या उम्मीद कर सकते हैं, आपको अपने प्रश्नों का परीक्षण करने की आवश्यकता है।

कुछ सामान्य दिशानिर्देश: इंडेक्सिंग एक पूर्ण जरूरी है, क्योंकि एक बाइनरी पेड़ में डेटा का सबसेट नेविगेट करना एक संपूर्ण टेबल को घुमाने के मुकाबले बहुत तेज़ है जब भारी आकार शामिल होता है। लोड समय की सहायता के लिए, आपको अपने डेटा को एक अद्वितीय इंडेक्स के लिए सॉर्ट करना चाहिए, और यदि आपके पास कोई अनन्य अनुक्रमणिका नहीं है तो सबसे बड़ी अनुक्रमणिका। यदि आप लोड करने से पहले सूचकांक छोड़ सकते हैं और इसे वापस रख सकते हैं, तो यह तेज़ होगा। यदि ये तकनीकें आपके ऑपरेटिंग और एसएलए पैरामीटर को पूरा नहीं कर पाती हैं, तो यह क्षैतिज विभाजन करने का समय है, और आपको आवश्यक डेटा रेंज में विस्तार करने के लिए "संलग्न" का उपयोग करें। SQLite 10 अटैचमेंट का समर्थन कर सकता है। मुझे कुछ पता है कि विभाजन उपकरण का काम है, डेवलपर्स नहीं, लेकिन जब आप शारीरिक सीमाओं का सामना कर रहे हैं तो आपको अपनी आस्तीन को रोल करना होगा या शायद आपके लिए कवर के तहत एक वाणिज्यिक टूल चुनना होगा।

0

आप 50MB या अधिक सीधे ग्राहक पक्ष पर तैनात DB, तो यह आपको कुछ गलत करते हैं मतलब है। कुंजी को संग्रहीत करते समय सर्वर पर माइग्रेट करने का प्रयास करें - क्लाइंट पर महत्वपूर्ण मान। (केवल संदर्भ) आपके पास वास्तविक समय नहीं होगा, लेकिन कम से कम यह एक उचित समाधान तैयार करेगा। "सर्वर साइड" अपने प्रश्न का उत्तर, वह यह है कि अगर आप ड्रॉप, या वास्तविक समय की आवश्यकताओं का अनुकूलन, क्योंकि क्या आप (अपने विवरण के आधार पर) है कि है। किसी भी मामले में। SQLite लगभग कुछ भी संभाल सकता है, लेकिन व्यक्तिगत अनुभव से, वास्तविक समय के परिणाम की तुलना में चीजों को यथासंभव सरल रखने की कोशिश करें।

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