SQLite एक लोकप्रिय, रिलेशनल डेटाबेस है जिसे आप अपने एप्लिकेशन में एम्बेड करते हैं। आपके डेटाबेस में डेटा की बढ़ती मात्रा के साथ, आपको SQLite प्रदर्शन ट्यूनिंग लागू करने की आवश्यकता है। यह आलेख इंडेक्स और इसके नुकसान, क्वेरी प्लानर के उपयोग, राइट-अहेड-लॉगिंग (वाल) जर्नल मोड और कैशे आकार को बढ़ाने पर चर्चा करता है। यह स्वचालित परीक्षणों का उपयोग करके आपके सुधारों के प्रभाव को मापने के महत्व के बारे में भी विस्तार से बताता है।
परिचय
SQLite एक लोकप्रिय, रिलेशनल डेटाबेस (DB) सिस्टम है . अपने बड़े, क्लाइंट-सर्वर आधारित भाइयों के विपरीत, जैसे कि MySQL, SQLite को आपके एप्लिकेशन में लाइब्रेरी के रूप में एम्बेड किया जा सकता है . SQLite में एक बहुत ही समान फीचर सेट है और यह लाखों पंक्तियों को भी संभाल सकता है, यह देखते हुए कि आप प्रदर्शन ट्यूनिंग के बारे में कुछ टिप्स और ट्रिक्स जानते हैं। जैसा कि निम्नलिखित अनुभागों में दिखाया जाएगा, सिर्फ सूचकांक बनाने के अलावा SQLite प्रदर्शन ट्यूनिंग के बारे में जानने के लिए और भी बहुत कुछ है।
सूचकांक बनाएं, लेकिन सावधानी के साथ
किसी अनुक्रमणिका का मूल विचार पढ़ने . को तेज़ करना है विशिष्ट डेटा का , यानी SELECT
WHERE
. के साथ स्टेटमेंट खंड। सूचकांक सॉर्टिंग में भी तेजी लाते हैं डेटा (ORDER BY
), या JOIN
आईएनजी टेबल। दुर्भाग्य से, सूचकांक एक दोधारी तलवार हैं, क्योंकि वे अतिरिक्त डिस्क स्थान का उपभोग करते हैं और वे डेटा हेरफेर को धीमा कर देते हैं (INSERT
, UPDATE
, DELETE
)।
सामान्य सलाह यह है कि जितना संभव हो उतना कम सूचकांक बनाएं, लेकिन जितना आवश्यक हो . साथ ही, सूचकांक केवल बड़े . के लिए ही मायने रखते हैं डेटाबेस, हजारों या लाखों पंक्तियों के साथ।
अपने प्रश्नों का विश्लेषण करने के लिए क्वेरी प्लानर का उपयोग करें
SQLite द्वारा आंतरिक रूप से सूचकांकों का उपयोग करने का तरीका प्रलेखित है, लेकिन समझने में बहुत आसान नहीं है। जैसा कि इस लेख में और विस्तार से बताया गया है, यह एक अच्छा विचार है कि किसी क्वेरी को EXPLAIN QUERY PLAN
के साथ उपसर्ग करके उसका विश्लेषण करें। . प्रत्येक आउटपुट लाइन पर एक नज़र डालें, जिसके तीन मूल रूप हैं:
SEARCH table ...
लाइनें एक अच्छा संकेत हैं – SQLite आपके किसी एक इंडेक्स का उपयोग करता है!SCAN table ... USING INDEX
एक बुरा संकेत है,SCAN table ...
और भी बुरा है!
SCAN table [using index]
. से बचने का प्रयास करें EXPLAIN QUERY PLAN
. के आउटपुट में प्रविष्टियां जब भी संभव हो, क्योंकि आप बड़े डेटाबेस पर प्रदर्शन समस्याओं में भाग लेंगे। EXPLAIN QUERY PLAN
Use का उपयोग करें जब तक कोई SCAN table
. नहीं है तब तक अपने सूचकांकों को जोड़ने या संशोधित करने के लिए पुनरावृत्त करें प्रविष्टियां दिखाई देती हैं।
ऐसी क्वेरी ऑप्टिमाइज़ करें जिनमें IS NOT
शामिल हैं
IS NOT ...
महंगा है क्योंकि SQLite को स्कैन करना होगा तालिका की सभी पंक्तियाँ, भले ही प्रभावित स्तंभ में अनुक्रमणिका हो . इंडेक्स केवल तभी उपयोगी होते हैं जब आप विशिष्ट मूल्यों की तलाश करते हैं, यानी तुलनाओं में < . शामिल हैं (छोटा), > (अधिक), या = (बराबर), लेकिन वे !=(असमान) के लिए आवेदन नहीं करते हैं।
एक साफ छोटी सी तरकीब यह है कि आप WHERE column != value
. को बदल सकते हैं WHERE column > value OR column < value
. के साथ . यह कॉलम की अनुक्रमणिका का उपयोग करेगा और उन सभी पंक्तियों को प्रभावी ढंग से प्रभावित करेगा जिनका मान value
. के बराबर नहीं है . इसी तरह, एक WHERE stringColumn != ''
WHERE stringColumn > ''
. से बदला जा सकता है , क्योंकि तार क्रमबद्ध हैं। हालांकि इस ट्रिक को लागू करते समय, सुनिश्चित करें कि आप जानते हैं कि SQLite NULL
को कैसे हैंडल करता है तुलना उदाहरण के लिए, SQLite NULL > ''
. का मूल्यांकन करता है FALSE
. के रूप में ।
यदि आप ऐसी तुलना ट्रिक का उपयोग करते हैं, तो आपकी क्वेरी में WHERE
होने की स्थिति में एक और चेतावनी है। और ORDER BY
, प्रत्येक एक अलग कॉलम के साथ:यह क्वेरी को फिर से अक्षम बना देगा। यदि संभव हो, तो उसी . का उपयोग करें WHERE
में कॉलम और ORDER BY
, या एक कवरिंग इंडेक्स . बनाएं जिसमें WHERE
. दोनों शामिल हैं और ORDER BY
कॉलम।
राइट-आगे-लॉग के साथ लिखने की गति में सुधार करें
द राइट-आगे-लॉगिंग (WAL) जर्नल मोड लेखन/अद्यतन प्रदर्शन में उल्लेखनीय सुधार करता है , डिफ़ॉल्ट रोलबैक . की तुलना में जर्नल मोड। हालांकि, जैसा कि यहां प्रलेखित है, कुछ चेतावनी हैं . उदाहरण के लिए, कुछ ऑपरेटिंग सिस्टम पर WAL मोड उपलब्ध नहीं है। साथ ही, हार्डवेयर विफलता के मामले में कम डेटा संगतता गारंटी है . आप जो कर रहे हैं उसे समझने के लिए पहले कुछ पन्नों को पढ़ना सुनिश्चित करें।
मैंने पाया कि कमांड PRAGMA synchronous = NORMAL
3-4x स्पीडअप प्रदान करता है। journal_mode
सेट करना करने के लिए WAL
फिर प्रदर्शन को फिर से महत्वपूर्ण रूप से सुधारता है (ऑपरेटिंग सिस्टम के आधार पर लगभग 10x या अधिक)।
जिन चेतावनियों का मैंने पहले ही उल्लेख किया है, उनके अलावा आपको निम्नलिखित के बारे में भी पता होना चाहिए:
- WAL जर्नल मोड का उपयोग करते हुए, आपके फाइल सिस्टम पर डेटाबेस फाइल के बगल में दो अतिरिक्त फाइलें होंगी, जिनका नाम डेटाबेस के समान होगा, लेकिन प्रत्यय "-shm" और "-wal" होगा। आम तौर पर आपको परवाह करने की आवश्यकता नहीं होती है, लेकिन यदि आप अपने एप्लिकेशन के चलने के दौरान डेटाबेस को किसी अन्य मशीन पर भेजना चाहते हैं, तो उन दो फाइलों को शामिल करना न भूलें। जब भी आप आम तौर पर सभी खुले डेटाबेस कनेक्शन बंद करते हैं तो SQLite इन दो फ़ाइलों को मुख्य फ़ाइल में संकुचित कर देगा।
- जब भी क्वेरी मुख्य डेटाबेस फ़ाइल में WAL लॉग फ़ाइल सामग्री के विलय को ट्रिगर करती है, तो सम्मिलित या अद्यतन प्रदर्शन कभी-कभी गिर जाएगा। इसे चेकपॉइंटिंग . कहा जाता है , यहां देखें।
- मैंने पाया कि
PRAGMA
जो बदलते हैंjournal_mode
औरsynchronous
ऐसा लगता है कि डेटाबेस में लगातार संग्रहीत नहीं किया जा रहा है। इस प्रकार, मैं हमेशा जब भी मैं एक नया डेटाबेस कनेक्शन खोलता हूं, उन्हें केवल पहली बार टेबल बनाते समय निष्पादित करने के बजाय उन्हें फिर से निष्पादित करें।
सब कुछ मापें
जब भी आप प्रदर्शन सुधार जोड़ते हैं, तो प्रभाव को मापना सुनिश्चित करें। स्वचालित (इकाई) परीक्षण इसके लिए एक बेहतरीन तरीका है। वे दस्तावेज़ . में मदद करते हैं आपकी टीम के लिए आपके निष्कर्ष, और वे समय के साथ विचलित व्यवहार को उजागर करेंगे , जैसे जब आप किसी नए SQLite संस्करण में अपडेट करते हैं। आप क्या माप सकते हैं इसके उदाहरण:
- वाल का उपयोग करने से क्या प्रभाव पड़ता है? रोलबैक . पर जर्नल मोड तरीका? अन्य (माना जाता है) प्रदर्शन-बढ़ाने वाले
PRAGMA
. का प्रभाव क्या है? एस? - एक बार जब आप कोई अनुक्रमणिका जोड़ते/बदलते/निकालते हैं, तो कितनी तेज़ी से
SELECT
बयान बन जाते हैं?INSERT/DELETE/UPDATE
कितनी धीमी गति से करें बयान बन जाते हैं? - सूचकांक कितने अतिरिक्त डिस्क स्थान का उपभोग करते हैं?
इनमें से किसी भी परीक्षण के लिए, उन्हें अलग-अलग डेटाबेस आकारों के साथ दोहराने पर विचार करें। उदा. उन्हें एक खाली डेटाबेस पर चलाएँ, और उस डेटाबेस पर भी जिसमें पहले से ही हज़ारों (या लाखों) प्रविष्टियाँ हों। आपको विभिन्न उपकरणों और ऑपरेटिंग सिस्टम पर भी परीक्षण चलाना चाहिए, खासकर यदि आपका विकास और उत्पादन वातावरण काफी अलग है।
कैश आकार ट्यून करें
SQLite अस्थायी जानकारी को कैश में संग्रहीत करता है (रैम में), उदा। SELECT
. के परिणाम बनाते समय क्वेरी, या डेटा में हेरफेर करते समय जो अभी तक प्रतिबद्ध नहीं है। डिफ़ॉल्ट रूप से यह आकार केवल 2 एमबी है . आधुनिक डेस्कटॉप मशीनें और भी बहुत कुछ बचा सकती हैं। चलाएं PRAGMA cache_size = -kibibytes
इस मान को बढ़ाने के लिए (माइनस पर ध्यान दें मूल्य के सामने हस्ताक्षर करें!) अधिक जानकारी के लिए यहां देखें। फिर से, माप इस सेटिंग का प्रदर्शन पर क्या प्रभाव पड़ता है!
पंक्ति बनाने या अपडेट करने के लिए REPLACE INTO का उपयोग करें
यह एक प्रदर्शन ट्वीक के रूप में इतना अधिक नहीं हो सकता है क्योंकि यह एक छोटी सी चाल है। मान लीजिए कि आपको अपडेट . करने की आवश्यकता है तालिका में एक पंक्ति t
, या बनाएं एक पंक्ति यदि यह अभी तक मौजूद नहीं है। दो प्रश्नों का उपयोग करने के बजाय (SELECT
उसके बाद INSERT
या UPDATE
), REPLACE INTO
. का उपयोग करें (आधिकारिक दस्तावेज़)।
इसके काम करने के लिए, एक अतिरिक्त डमी कॉलम जोड़ें (उदा. replacer
) टेबल पर t
, जिसमें एक UNIQUE
. है विवश करना। कॉलम की घोषणा उदा। हो ... replacer INTEGER UNIQUE ...
यह आपके CREATE TABLE
. का हिस्सा है बयान। फिर किसी क्वेरी का उपयोग करें जैसे कि
REPLACE INTO t (col1, col2, ..., replacer) VALUES (?,?,...,1)
Code language: SQL (Structured Query Language) (sql)
जब यह क्वेरी पहली बार चलती है, तो यह केवल INSERT
का प्रदर्शन करेगी . जब इसे दूसरी बार चलाया जाता है, तो UNIQUE
replacer
. की बाधा कॉलम ट्रिगर होगा, और विरोध समाधान व्यवहार के कारण पुरानी पंक्ति को छोड़ दिया जाएगा, जिससे स्वचालित रूप से एक नई पंक्ति बन जाएगी। आपको उपयोगी होने के लिए संबंधित यूपीएसईआरटी कमांड भी मिल सकती है।
निष्कर्ष
एक बार आपके डेटाबेस में पंक्तियों की संख्या बढ़ने के बाद, प्रदर्शन में बदलाव एक आवश्यकता बन जाते हैं। सूचकांक सबसे आम समाधान हैं। वे कम स्थान-जटिलता के लिए बेहतर समय जटिलता का व्यापार करते हैं, पढ़ने की गति में सुधार करते हैं, जबकि डेटा संशोधन प्रदर्शन को नकारात्मक रूप से प्रभावित करते हैं। A मैंने प्रदर्शित किया है, असमानता . की तुलना करते समय आपको अतिरिक्त सावधानी बरतने की आवश्यकता है में SELECT
कथन, क्योंकि SQLite इस प्रकार की तुलनाओं के लिए सूचकांकों का उपयोग नहीं कर सकता है। मैं आमतौर पर क्वेरी प्लानर . का उपयोग करने की सलाह देता हूं यह बताता है कि प्रत्येक SQL क्वेरी के लिए आंतरिक रूप से क्या होता है। जब भी आप किसी चीज़ में बदलाव करते हैं, तो प्रभाव को मापें!