2008-10-09 8 views
6

मैं सेंसर रीडिंग को पकड़ने के लिए एक सरल SQLite डेटाबेस सेट अप कर रहा हूं। टेबल कुछ इस तरह दिखेगा:प्रश्नों के समक्ष आने से पहले SQLite तालिका कितनी पंक्तियां हो सकती है

sensors 
- id (pk) 
- name 
- description 
- units 

sensor_readings 
- id (pk) 
- sensor_id (fk to sensors) 
- value (actual sensor value stored here) 
- time (date/time the sensor sample was taken) 

आवेदन के बारे में 30 विभिन्न सेंसरों से प्रति माह लगभग 100,000 सेंसर रीडिंग पर कब्जा हो जाएगा, और मैं जब तक संभव हो डीबी के सारे सेंसर रीडिंग रखना चाहते हैं।

अधिकांश प्रश्नों रूप

SELECT * FROM sensor_readings WHERE sensor_id = x AND time > y AND time < z 

में होगा यह प्रश्न आमतौर पर वापस आ जाएगी 100-1000 के बारे में परिणाम है।

तो सवाल यह है कि उपरोक्त क्वेरी से पहले सेंसर_readings तालिका कितनी बड़ी हो सकती है (मानक पीसी पर कुछ सेकंड से अधिक)।

मुझे पता है कि एक फिक्स प्रत्येक सेंसर के लिए एक अलग सेंसर_readings तालिका बनाने के लिए हो सकता है, लेकिन अगर यह अनावश्यक है तो मैं इससे बचना चाहूंगा। क्या इस डीबी स्कीमा को अनुकूलित करने के कोई अन्य तरीके हैं?

उत्तर

2

क्या आप इंडेक्स को सही तरीके से सेट कर रहे हैं? इसके अलावा http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html पढ़ने का एकमात्र उत्तर है, 'आपको स्वयं को मापना होगा' - खासकर जब से यह हार्डवेयर पर भारी निर्भर करेगा और चाहे आप इन-मेमोरी डेटाबेस या डिस्क पर उपयोग कर रहे हों, और यदि आप लेनदेन में आवेषण लपेटें या नहीं।

कहा जा रहा है कि मैंने हजारों पंक्तियों के बाद उल्लेखनीय देरी की है, लेकिन यह बिल्कुल गैर-अनुकूलित था - थोड़ा पढ़ने से मुझे यह धारणा मिलती है कि 100 हजार पंक्तियों वाले लोग हैं उचित इंडेक्स आदि के साथ, जिनके पास कोई समस्या नहीं है।

4

यदि आप प्रश्नों में time का उपयोग करने जा रहे हैं, तो यह इसके लिए एक सूचकांक जोड़ना उचित है। यह एकमात्र अनुकूलन होगा जो मैं आपकी जानकारी के आधार पर सुझाव दूंगा।

प्रति माह 100,000 प्रविष्टियां लगभग 2.3 प्रति मिनट के बराबर होती हैं, इसलिए एक और सूचकांक बहुत कठिन नहीं होगा और यह आपके प्रश्नों को तेज़ करेगा। मुझे लगता है कि सभी सेंसर के लिए 100,000 प्रविष्टियां हैं, प्रत्येक सेंसर के लिए 100,000 नहीं, लेकिन अगर मुझे गलत लगता है, तो 70 मिनट प्रति मिनट अभी भी ठीक होना चाहिए।

यदि प्रदर्शन एक मुद्दा बन जाता है, तो आपके पास पुराने डेटा को ऐतिहासिक तालिका में कहने का विकल्प है (कहें, sensor_readings_old) और केवल गैर-ऐतिहासिक तालिका (sensor_readings) पर अपने प्रश्न पूछें।

फिर आपके पास सामान्य प्रश्नों को प्रभावित किए बिना कम से कम सभी डेटा उपलब्ध हैं। यदि आप वास्तव में पुराने डेटा पर जाना चाहते हैं, तो आप ऐसा कर सकते हैं लेकिन आपको पता चलेगा कि इसके लिए पूछताछ में कुछ समय लग सकता है।

1

SQLite अब आर-पेड़ इंडेक्स (http://www.sqlite.org/rtree.html) का समर्थन करता है, आदर्श यदि आप बहुत समय सीमा प्रश्न पूछना चाहते हैं तो आदर्श।

टॉम

1

मैं जानता हूँ कि मैं इस देर के लिए आ रहा हूँ, लेकिन मुझे लगा कि यह किसी को भी है कि बाद में इस सवाल को देखकर आता है के लिए उपयोगी हो सकता है: के रूप में लंबे समय के रूप

SQLite पढ़ने पर अपेक्षाकृत तेज हो जाता है यह केवल एक ही समय में एक ही एप्लिकेशन/उपयोगकर्ता की सेवा कर रहा है। समेकन और अवरोध कई उपयोगकर्ताओं या अनुप्रयोगों को एक ही समय में एक्सेस करने वाले मुद्दों के साथ हो सकता है और एमएस एसक्यूएल सर्वर जैसे अधिक मजबूत डेटाबेस उच्च समेकन वातावरण में बेहतर काम करते हैं।

जैसा कि अन्य ने कहा है, यदि आप पढ़े गए प्रश्नों की गति के बारे में चिंतित हैं तो मैं निश्चित रूप से तालिका को अनुक्रमित करूंगा। आपके विशेष मामले के लिए, मैं शायद एक इंडेक्स तैयार करूंगा जिसमें आईडी और समय दोनों शामिल हों।

आप लिखने की गति पर भी ध्यान देना चाहेंगे। सम्मिलन तेजी से हो सकता है, लेकिन काम धीमा हो जाता है, इसलिए आप प्रतिबद्धता से पहले एक लेनदेन में कई प्रविष्टियों को एक साथ जोड़ना चाहते हैं। इस पर चर्चा की गई है: http://www.sqlite.org/faq.html#q19

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