Theory
Ghost Columns और Invisible Tables
जब आप SELECT name, roll_no FROM students; जैसी एक database table query करते हैं, आप उन structural elements को पढ़ने की उम्मीद करते हैं जो आपने ख़ुद स्पष्ट रूप से बनाए। पर पर्दे के पीछे, Oracle हर row से जुड़े secret tracking variables रखता है, और एक magic single-row structural table देता है जो विशुद्ध रूप से quick mathematical calculations या system checkups का जवाब देने के लिए मौजूद है। अगर आप hard drive chip पर बिल्कुल physical slot जानना चाहते हैं जहाँ एक row save है, या अगर आप बस एक built-in string function को असल student data से जोड़े बिना test करना चाहते हैं, आप यह कैसे करते हैं? यहीं ROWID pseudo-column और DUAL table आपके बचाव में आते हैं।
Theory
GPS Latitude Coordinate बनाम Empty Scratchpad Paper
ROWID को एक physical house पर उकेरे एक स्थायी GPS coordinate stamp (Latitude, Longitude, और Floor Number) की तरह सोचिए। भले बिल्कुल एक ही नाम साझा करते दो लोग एक जैसी दिखती houses में जाएँ, उनके geographic GPS codes पूरी तरह अलग रहेंगे। दूसरी ओर, DUAL table को अपने study desk पर एक blank scratchpad sticky note की तरह सोचिए। अगर आप 45 को 12 से गुणा करना या आज की date जाँचना चाहते हैं, आपको एक विशाल ledger book खोलने या एक नई student directory बनाने की ज़रूरत नहीं; आप बस उस छोटे single-square sticky note पर math लिखते हैं, quick जवाब पढ़ते हैं, और आगे बढ़ते हैं!
Theory
Physical Address Blueprint: ROWID
Oracle SQL में, एक Pseudo-column query करने पर बिल्कुल एक regular table column की तरह बर्ताव करता है, पर इसका data असल में आपकी table की custom column definitions के अंदर store नहीं होता। ROWID एक row access करने का सबसे तेज़ संभव तरीक़ा है क्योंकि इसमें storage media पर tuple का बिल्कुल binary address होता है। यह एक 18-character base-64 string के रूप में दर्शाया जाता है जो चार सटीक संरचनात्मक हिस्सों में बँटा है।
Theory
एक Extended ROWID की संरचना
एक extended ROWID OOOOOOFFFBBBBBBRRR जैसे letters के एक sequence जैसा दिखता है। आइए तोड़ें कि हर segment database engine को क्या उजागर करता है:
At a glance
Table 1: Oracle Extended ROWID strings का architectural structure break down।
| ROWID Segment Characters | Component Represented | Physical Storage Function |
|---|---|---|
Chars 1 - 6 (OOOOOO) | Data Object Number | ख़ास database segment/table structure id पहचानता है। |
Chars 7 - 9 (FFF) | Relative Datafile Number | storage drive पर बिल्कुल physical operating system file की ओर point करता है। |
Chars 10 - 15 (BBBBBB) | Data Block Number | row data रखता सटीक memory allocation block pinpoint करता है। |
Chars 16 - 18 (RRR) | Row Slot Number | उस ख़ास block के अंदर बिल्कुल directory index slot location पहचानता है। |
Theory
Universal Scratchpad: DUAL Table
DUAL table एक ख़ास, one-row, one-column dummy table है जो Oracle द्वारा data dictionary के साथ अपने-आप बनाई जाती है। यह schema user SYS की है पर public privilege के तहत सारे database users द्वारा globally accessible है। इसमें बिल्कुल एक column है जिसका नाम DUMMY है जो एक VARCHAR2(1) के रूप में परिभाषित है, और value 'X' के साथ एक अकेली row रखता है। क्योंकि इसमें बिल्कुल एक row है, आप इसके ख़िलाफ़ जो भी function या equation call करते हैं वह बिल्कुल एक बार evaluate होता है, इसे expressions testing के लिए आदर्श बनाते हुए।
Practical
Lookups Execute करना और Functions Test करना
-- Step 1: Query the physical location coordinate of your data
SELECT rowid, student_name FROM student_profile;
-- Step 2: Use DUAL to run a quick mathematical computation
SELECT (45 * 2) + 10 FROM DUAL;
-- Step 3: Fetch the current system date and time stamp using DUAL
SELECT SYSDATE FROM DUAL;
-- Step 4: Test a string function conversion on a dummy literal
SELECT LOWER('EXAM SUCCESS') FROM DUAL;Think first
Single-Row Evaluation नियम
क्या होता अगर आप 500 student rows रखती एक table पर 'SELECT SYSDATE FROM DUAL;' चलाने के बजाय query 'SELECT SYSDATE FROM student_profile;' चलाते?
Show the answer
query सफलतापूर्वक execute होगी, पर यह बिल्कुल वही system date 500 अलग बार print करेगी! क्यों? क्योंकि SQL statements हमेशा target table में मौजूद हर row के लिए एक output line return करते हैं। यही बिल्कुल वजह है कि DUAL table को केवल 1 row के साथ design किया गया था: यह guarantee देता है कि आपको database buffers को ग़ैर-ज़रूरी दोहराई text lines से load किए बिना बिल्कुल एक साफ़ result line वापस मिले।
Quiz
एक ख़ास row record के ROWID value का क्या होता है अगर आप एक UPDATE statement execute करते हैं जो एक student का name value बदलता है?
- ROWID तुरंत बदलता है क्योंकि row contents एक नए memory segment में फिर से लिखे जाते हैं।
- ROWID पूरी तरह अपरिवर्तित रहता है क्योंकि storage disk block पर row का physical location वही रहता है।
- row को एक COMMIT trigger होने तक एक temporary null value assign होता है।
- system row slot को पूरी तरह drop करता है और एक नया database object id बनाता है।
Show the answer
ROWID पूरी तरह अपरिवर्तित रहता है क्योंकि storage disk block पर row का physical location वही रहता है।
ROWID disk पर एक row का physical storage location पहचानता है। columns के अंदर data values बदलना (जैसे एक name string modify करना) यह नहीं बदलता कि row disk पर physically कहाँ बैठती है। इसलिए, ROWID पूरी तरह fixed और constant रहता है।
Quiz
निम्न में से कौन सा वर्णन Oracle की internal DUAL table के structural components को सटीक परिभाषित करता है?
- इसमें 2 columns और 2 rows हैं, calculation parameters दोबारा जाँचने के लिए design किया गया।
- इसमें 0 columns और 1 row है, administrative tasks के लिए एक placeholder container के रूप में काम करते हुए।
- इसमें बिल्कुल 1 column है जिसका नाम DUMMY है और बिल्कुल 1 row है value 'X' के साथ।
- यह एक temporary view है जो आपके session बंद होते ही ग़ायब हो जाता है।
Show the answer
इसमें बिल्कुल 1 column है जिसका नाम DUMMY है और बिल्कुल 1 row है value 'X' के साथ।
DUAL table static रूप से एक असली table के रूप में एक column (DUMMY) और बिल्कुल एक row जो value character 'X' रखती है, के साथ संरचित है। यह structural configuration पक्का करता है कि इसके ख़िलाफ़ evaluate किया कोई भी scalar function या expression एक अकेली unique row output line return करे।
Watch out
Classic जाल: Delete Duplicate की उलझन
university interviews में एक बहुत लोकप्रिय और चालाकी वाला सवाल है: 'आप एक table से एक जैसी duplicate rows कैसे delete करते हैं अगर वे सारे columns में बिल्कुल एक जैसे values साझा करती हैं?' आप उन्हें names या roll numbers इस्तेमाल करके filter नहीं कर सकते क्योंकि वे पूरी तरह मेल खाती हैं! समाधान ROWID इस्तेमाल करना है। भले दो rows एक इंसान को एक जैसी दिखें, उनके ROWID strings अलग होने की guarantee है क्योंकि वे अलग physical slots में रहती हैं। आप इस तरह एक query लिख सकते हैं: DELETE FROM students A WHERE A.rowid > (SELECT MIN(B.rowid) FROM students B WHERE A.roll_no = B.roll_no); ताकि duplicates को सुरक्षित रूप से मिटाएँ!
Theory
Semester 3 Performance Optimization से जोड़ना
ROWID समझना आपको अपने advanced Semester 3 database performance modules के लिए एक बड़ी बढ़त देता है। जब आप एक explicit Database Index बनाते हैं, Oracle एक तेज़ lookup tree बनाता है जो search keys को सीधे उनके corresponding ROWID values से map करता है। यह storage engine को तुरंत बिल्कुल disk location पर सीधे कूदने देता है, धीमे full-table storage scans skip करते हुए।
Summary
Key takeaways
- ROWID एक internal Oracle pseudo-column है जो disk storage पर एक row का बिल्कुल physical address उजागर करता है।
- एक extended ROWID एक base-64 encoded string है जिसमें Object ID, Relative Datafile number, Block ID, और Row Slot हैं।
- DUAL table एक built-in single-row, single-column table है जो expressions testing के लिए एक quick scratchpad के रूप में इस्तेमाल होता है।
- DUAL के ख़िलाफ़ functions query करना पक्का करता है कि values (जैसे SYSDATE या math logic) बिल्कुल एक बार evaluate हों।
- ROWIDs structural modifications भर स्थिर रहते हैं, जब तक row physically delete या re-located न हो।
- Memory Hook: ROWID आपकी row का physical storage address stamp है, और DUAL आपका सुरक्षित, single-row scratching pad है!