SQL डेटाबेस इंजन के सामान्य काम करने का तरीका
- सभी SQL डेटाबेस इंजन लगभग एक जैसे तरीके से काम करते हैं
- इनपुट SQL स्टेटमेंट को "Prepared Statement" में बदलते हैं
- Prepared Statement को "execute" करके परिणाम बनाते हैं
- SQLite में Prepared Statement को
sqlite3_stmt ऑब्जेक्ट के instance के रूप में दर्शाया जाता है
- Prepared Statement को दर्शाने के दो बड़े तरीके हैं
- bytecode तरीका: SQLite में उपयोग होता है
- object tree तरीका: MySQL, PostgreSQL में उपयोग होता है
bytecode तरीके के फायदे
- समझने में आसान
- यह सरल निर्देशों की सूची से बना होता है, इसलिए इसे आसानी से प्रिंट किया जा सकता है
EXPLAIN keyword का उपयोग करके SQL स्टेटमेंट का bytecode देखा जा सकता है
- debugging आसान होती है
- parsing/analysis चरण और execution चरण स्पष्ट रूप से अलग होते हैं
- debugging build में
PRAGMA vdbe_trace=ON कमांड से bytecode execution को trace किया जा सकता है
- incrementally execute किया जा सकता है
- bytecode में लिखे SQL स्टेटमेंट को एक-एक row चलाकर रोका और फिर से शुरू किया जा सकता है
- object tree तरीके में पूरा tree एक बार में execute होता है, इसलिए incremental execution कठिन होता है
- memory उपयोग कम होता है
- bytecode का आकार AST से छोटा होता है
- Prepared Statement लंबे समय तक memory में cache किए जाते हैं, इसलिए memory उपयोग महत्वपूर्ण है
- execution speed तेज होती है
- हर चरण में तय करने वाली चीजें कम होती हैं, इसलिए execution तेज होता है
object tree तरीके के फायदे
- runtime पर query plan बदला जा सकता है
- object tree को execution के दौरान भी आसानी से बदला जा सकता है
- query की प्रगति के अनुसार dynamic optimization संभव है
- parallelize करना आसान है
- हर processing node को अलग thread में सौंपा जा सकता है
- nodes के बीच केवल data transfer को synchronize करना होता है
- बड़े पैमाने की analytical queries (OLAP) को multi-core पर चलाने में यह फायदेमंद है
GN⁺ की राय
- SQLite का मुख्य लक्ष्य IoT वातावरण में transaction processing (OLTP) है, इसलिए bytecode तरीका उपयुक्त लगता है। यह सरल, हल्का और तेज प्रदर्शन दे सकता है।
- दूसरी ओर, MySQL या PostgreSQL का उपयोग बड़े पैमाने के data analysis में भी बहुत होता है, इसलिए query execution plan को dynamically optimize और parallelize कर सकने वाले object tree तरीके के फायदे अधिक उभर सकते हैं।
- हालांकि, object tree तरीके की कमी यह भी है कि debugging या performance analysis कठिन हो सकता है। साथ ही, tree traversal cost आदि के कारण सरल queries के मामले में यह bytecode से धीमा भी हो सकता है।
- महत्वपूर्ण बात यह है कि उपयोग और उद्देश्य के अनुसार सही तरीका चुना जाए। सामान्य-purpose RDBMS के लिए दोनों तरीकों के फायदे-नुकसान का संतुलन रखने वाला hybrid तरीका भी विचार करने लायक है।
1 टिप्पणियां
Hacker News राय
SQL क्वेरी चलाने के लिए AST के बजाय bytecode virtual machine (VM) का उपयोग करना SQLite का डेटाबेस डिज़ाइन में एक दिलचस्प विकल्प है। AST की तुलना में bytecode के फ़ायदे इस प्रकार हैं:
Bytecode VM और interpreter अक्सर general-purpose programming languages से जुड़े होते हैं, लेकिन वे निम्नलिखित अन्य संदर्भों में भी आश्चर्यजनक रूप से उपयोगी हो सकते हैं:
Microsoft SQL Server आंतरिक रूप से object tree का उपयोग करता है, लेकिन query plan output अब भी table के रूप में होता है, जो दिखाता है कि object tree को table के रूप में render करना कठिन है।
प्रोग्रामर अक्सर ठीक-ठीक जानते हैं कि कौन-सा index lookup loop में होना चाहिए, इसलिए कुछ मामलों में SQL की जगह सीधे bytecode लिखना या उच्च-स्तरीय imperative language का उपयोग करना फ़ायदेमंद हो सकता है। इसे SQL में व्यक्त करना बोझिल हो सकता है।
अगर bottleneck bytecode execution में नहीं है (जैसे memory या disk speed), तो JIT compilation के ज़रिए इसे native code में बदलना अनिवार्य नहीं हो सकता।
Python, Ruby, Lua जैसी कई programming languages आंतरिक रूप से bytecode या AST का उपयोग करती हैं। डेटाबेस डिज़ाइन के फ़ैसलों के कारण, आसानी से parse किए जा सकने वाले statements error-prone third-party library या ORM implementation के लिए उपयोगी हो सकते हैं.