हमें लगभग 5000 पीआर की दर से वास्तविक समय का जीपीएस डेटा प्राप्त होता है। मिनट (4 टीसीपी सर्वर से)। प्रत्येक सर्वर डेटा सम्मिलित करने के लिए एकल कनेक्शन का उपयोग करता है, और आवेषण के बीच में डेटा को बफ़र करता है। हर 15 मिनट में, एक सेवा इस डेटा को प्राप्त करती है, और इसे यात्राओं में संसाधित करती है। एक बार यात्राएं उत्पन्न हो जाने के बाद, वास्तविक जीपीएस डेटा आमतौर पर इतना महत्वपूर्ण नहीं होता है, केवल अगर उपयोगकर्ता नक्शे पर मार्ग देखना चाहता है।
समस्या यह है कि ऐसा लगता है कि डेटाबेस डेटा डालने की दर के साथ संघर्ष करने के लिए संघर्ष कर रहा है। कभी-कभी जब लोड बढ़ता है, तो डालने का समय अचानक काफी बढ़ जाता है (> 30 सेकंड), जो बदले में अधिक डेटा को बफर करने की अनुमति देता है, जिसके परिणामस्वरूप बड़े आवेषण और लंबे समय तक डालने की अवधि होती है।
मुझे उम्मीद है कि वर्तमान डिज़ाइन पर कुछ टिप्पणियां, और कुछ विचारों को हमें प्रदर्शन में सुधार करना होगा, और हमारे कुछ सवालों के जवाब - और किसी भी अन्य लोगों के सुझाव हो सकते हैं!
मौजूदा डिज़ाइन
डेटा वर्तमान में एक सप्ताह का प्रतिनिधित्व करने वाली तालिकाओं में अलग हो गया है, और एक वर्ष से अधिक पुराने डेटा को एक द्वितीयक डेटाबेस में संग्रहीत किया गया है। संपूर्ण चीज़ एक संपादन योग्य दृश्य में एक साथ शामिल हो जाती है, जिसका उपयोग आवेषण और रीड दोनों के लिए किया जाता है।
टेबल डिजाइन
- आईडी (पीके, अद्वितीय पहचानकर्ता)
- DeviceId (FK, int)
- व्यक्ति (FK, int)
- वाहन आई (FK, int)
- टोकनएड (FK, int)
- UtcTime (पीके, डेटाटाइम 2 (3))
- अक्षांश (फ्लोट)
- देशांतर (नाव)
- गति (छोटा)
- शीर्षक (छोटा)
- उपग्रह (छोटे)
- IOData (वैरिएंट (100))
- इग्निशनस्टैट (टिनींट)
- UserInput (छोटे)
- CreateTimeUtc (datetime2 (3))
सूचकांकों
- DeviceId_CreateTimeUtc_Desc
- DeviceId_UtcTime_Desc (क्लस्टर किया गया)
- PersonId_UtcTime_Desc
- TokenId_UtcTime_Desc
- VehicleId_UtcTime_Desc
हर हफ्ते वर्तमान में सूचकांकों सहित लगभग 10 जीबी लगते हैं, और वर्तमान में मुख्य डेटाबेस में लगभग 300 जीबी डेटा है।
मुख्य डेटाबेस में डेटा टेबल के पास 1 फ़ाइल के साथ अपना स्वयं का फ़ाइलग्रुप है, लेकिन यह मुख्य डेटाबेस में अन्य सभी तालिकाओं के समान डिस्क पर है। द्वितीयक डेटाबेस एक अलग डिस्क पर है, लेकिन एक ही मशीन पर।
मुझे लगता है कि जब हम एक नया टेबल विभाजन (सप्ताह) उपयोग में लिया जाता है, तो हम एक इंडेक्स रिबूट जॉब साप्ताहिक भी चला रहे हैं। कोई संकोचन नहीं किया जाता है।
मशीन 12-जीबी मेमोरी के साथ एक 8-कोर एचपी है, और मुख्य डेटाबेस को पकड़ने वाली डिस्क RAID 10 चल रही है।
विचार
- प्राथमिक डेटाबेस में संग्रहीत डेटा की मात्रा को अधिकतम 1 महीने तक सीमित करें। बहुत कम से कम यह डेटाबेस को बैकअप / बहाली के लिए अधिक प्रबंधनीय बना देगा, लेकिन क्या हम ऐसा करके प्रदर्शन में सुधार देखने की उम्मीद कर सकते हैं?
- वर्तमान डेटा के लिए फ़ाइल समूह में 2 फ़ाइलें बनाएँ, और उन्हें 2 अलग-अलग भौतिक विभाजनों पर वितरित करें
- वर्तमान डेटा रखने वाले मास्टर-स्लेव डेटाबेस बनाएँ, इसलिए आवेषण और रीड विभिन्न डेटाबेस पर किए जाते हैं
- SSD डिस्क पर वर्तमान डेटा के लिए फ़ाइलें रखें (क्या SSD डिस्क के साथ प्रदर्शन में कोई बदलाव होगा?)
कृपया मुझे बताएं कि क्या अधिक जानकारी की आवश्यकता है। प्रदर्शन को प्रभावित करने वाले कई कारक हैं, और शायद इसे ट्विक करने के कई तरीके हैं।