Theory
database एक ticket तुरंत कैसे खोजता है?
कल्पना कीजिए आप हमारा TicketDesk system चला रहे हैं और एक critical bug ticket को एक तुरंत update चाहिए। Oracle उस बिल्कुल record को लाखों में से milliseconds में कैसे pinpoint करता है? साथ ही, क्या हो अगर आप बस आज की date जाँचना या एक SQL function को असल tickets table पर चलाने से पहले test करना चाहते हैं? आप बस एक quick calculation करने के लिए असल data scan नहीं करना चाहते। Oracle इन बिल्कुल स्थितियों के लिए दो छिपे औज़ार देता है: ROWID pseudo column और DUAL table।
Theory
Warehouse Plot और Scratchpad
ROWID को एक विशाल warehouse में एक box के बिल्कुल GPS coordinate या aisle shelf number की तरह सोचिए। भले दो boxes एक जैसी दिखें, उनका physical location पूरी तरह unique रहता है। दूसरी ओर DUAL table, आपके desk पर एक sticky note की तरह है। आप बस एक सरल जोड़ calculate करने के लिए एक विशाल ledger book नहीं खोलते। आप इसे एक छोटे scratchpad पर लिखते हैं जिसमें बिल्कुल एक ख़ाली जगह है।
Theory
ROWID और DUAL समझना
Oracle dialect में, ROWID एक pseudo column है। query करने पर यह एक regular table column जैसा दिखता है, पर यह असल में आपकी table definition में store नहीं होता। इसके बजाय, यह disk storage पर एक row का बिल्कुल physical address दर्शाता है। DUAL table एक विशेष, built-in Oracle table है जिसमें DUMMY नामक बिल्कुल एक column और value X के साथ बिल्कुल एक row है। यह expressions evaluate करने या SYSDATE जैसे system values fetch करने के लिए एक dummy table के रूप में काम करता है।
At a glance
Oracle के छिपे address locator और dummy workspace table की तुलना
| Feature | ROWID Pseudo Column | DUAL Table |
|---|---|---|
| यह क्या है? | एक row का physical address रखता एक छिपा column | एक row और एक column वाली एक असली physical table |
| Primary Use | एक ख़ास row तक सबसे तेज़ संभव पहुँच | functions, math, या system constants evaluate करना |
| Storage | dynamically उत्पन्न, table schema में store नहीं | Oracle data dictionary में स्थायी रूप से store |
| Example Query | SELECT ROWID, title FROM tickets; | SELECT SYSDATE FROM dual; |
Practical
Physical Addresses और System Constants Query करना
-- Step 1: See the physical address of our tickets
SELECT ROWID, id, title FROM tickets;
-- Step 2: Use the single row DUAL table to get the system date for TicketDesk
SELECT SYSDATE FROM dual;Quiz
क्या होगा अगर आप query 'SELECT 10 + 20 FROM tickets;' चलाते हैं यह मानते हुए कि tickets table में मौजूदा में 15 rows हैं?
- यह value 30 के साथ एक row return करेगी
- यह 15 rows return करेगी, हर एक value 30 दिखाती हुई
- यह एक syntax error फेंकेगी क्योंकि 10 + 20 एक असली column नहीं है
- यह एक बेतरतीब row का physical address return करेगी
Show the answer
यह 15 rows return करेगी, हर एक value 30 दिखाती हुई
चूँकि query tickets table को target करती है, Oracle उस table में मौजूद हर एक row के लिए expression evaluate करता है। चूँकि 15 rows हैं, यह परिणाम 30 पंद्रह बार print करता है। यह दोहराया behavior बिल्कुल वजह है कि हम एक single calculation result चाहने पर इसके बजाय single row DUAL table इस्तेमाल करते हैं!
Think first
Mental Challenge: Address द्वारा एक Record खोजना
tickets table से ticket title खोजने के लिए एक SQL query मन में बनाइए जहाँ physical disk address एक ख़ास hex value जैसे AAAR3sAAEAAAACXAAA से मेल खाता है। reveal करने से पहले इसके बारे में सोचिए।
Show the answer
query है: SELECT title FROM tickets WHERE ROWID = 'AAAR3sAAEAAAACXAAA'; यह सबसे तेज़ संभव तरीक़ा है जिससे Oracle एक अकेली row fetch कर सकता है क्योंकि यह indexes और full table scans को दरकिनार करके सीधे disk block तक जाता है।
Watch out
Hardcoded ROWID जाल
अपने application code या university exam answers के अंदर कभी एक ROWID string hardcode मत कीजिए! जबकि एक ROWID सबसे तेज़ पहुँच देता है, यह स्थायी नहीं है। अगर एक table फिर से बनाई जाती है, export और import की जाती है, या एक row को इस तरह update किया जाता है कि row movement हो, physical address पूरी तरह बदल जाता है। ROWID को हमेशा एक अस्थायी runtime address मानिए, एक स्थायी primary key नहीं।
Theory
असली दुनिया और भविष्य के Semesters
अपने practical labs में, आप records insert करने से पहले built-in functions test करने या sequences इस्तेमाल करके primary keys बनाने के लिए DUAL लगातार इस्तेमाल करेंगे। Sem 3 जैसे बाद के semesters में जब SQLite या अन्य databases पढ़ते हैं, आप SELECT expression बिना एक FROM clause जैसे समतुल्य पाएँगे। Oracle सख़्ती से एक FROM clause माँगता है, जो DUAL को एक पूर्ण अनिवार्यता बनाता है।
Summary
Key takeaways
- ROWID एक Oracle pseudo column है जो एक row का बिल्कुल physical disk address दर्शाता है।
- एक WHERE clause में ROWID इस्तेमाल करना सबसे तेज़ संभव row retrieval speed देता है।
- ROWIDs बदल सकते हैं अगर tables फिर से बनाई जाएँ, इसलिए उन्हें कभी primary keys के रूप में इस्तेमाल नहीं करना चाहिए।
- DUAL एक built-in Oracle table है जिसमें DUMMY नामक बिल्कुल एक row और एक column है।
- DUAL उन queries को चलाने के लिए इस्तेमाल होता है जो एक अकेला result return करती हैं, जैसे system dates या calculations।
- Memory hook: ROWID GPS coordinate है, DUAL desktop scratchpad है!