Theory
ભૂતિયા Columns અને અદૃશ્ય Tables
જ્યારે તમે SELECT name, roll_no FROM students; જેવી એક database table ને query કરો, ત્યારે તમે એવાં સંરચનાત્મક તત્ત્વો વાંચવાની અપેક્ષા રાખો છો જે તમે જાતે સ્પષ્ટપણે બનાવ્યાં હોય. પણ પડદા પાછળ, Oracle દરેક હરોળ સાથે જોડાયેલા ગુપ્ત tracking ના variables રાખે છે, અને એક જાદુઈ એક-હરોળનું સંરચનાત્મક table આપે છે જે માત્ર ઝડપી ગાણિતિક ગણતરીઓ કે system ની તપાસના જવાબ આપવા જ અસ્તિત્વમાં છે. જો તમારે hard drive ની chip પર બિલકુલ કયા ભૌતિક ખાનામાં એક હરોળ સચવાઈ છે એ જાણવું હોય, કે તમારે ખાલી એક built-in string function ને ખરેખરા student data સાથે જોડ્યા વગર ચકાસવું હોય, તો તમે એ કેવી રીતે કરો? અહીં જ ROWID pseudo-column અને DUAL table તમારી વહારે આવે છે.
Theory
GPS ના Latitude Coordinate સામે કોરી ચબરખી
ROWID ને એક ભૌતિક ઘર પર કોતરેલા કાયમી GPS coordinate ના થપ્પા (Latitude, Longitude, અને માળનો નંબર) જેવો વિચારો. બિલકુલ એક જ નામ ધરાવતા બે લોકો એકસરખાં દેખાતાં ઘરોમાં રહેવા જાય તો પણ, એમના ભૌગોલિક GPS codes તદ્દન અલગ રહેશે. બીજી બાજુ, DUAL table ને તમારા અભ્યાસના મેજ પરની કોરી ચબરખી જેવું વિચારો. જો તમારે 45 ને 12 થી ગુણવું હોય કે આજની તારીખ તપાસવી હોય, તમારે એક વિશાળ ચોપડો ખોલવાની કે નવી student directory બનાવવાની જરૂર નથી; તમે એ નાનકડી એક-ચોરસ ચબરખી પર ગણિત ઘસડી નાખો, ઝડપી જવાબ વાંચો, અને આગળ વધો!
Theory
ભૌતિક સરનામાનો નકશો: ROWID
Oracle SQL માં, એક Pseudo-column તમે query કરો ત્યારે બિલકુલ એક સામાન્ય table column ની જેમ વર્તે છે, પણ એનો data ખરેખર તમારા table ની custom column ની વ્યાખ્યાઓની અંદર સંઘરાયેલો હોતો નથી. ROWID એ એક હરોળ સુધી પહોંચવાનો સૌથી ઝડપી શક્ય રસ્તો છે કારણ કે એમાં સંગ્રહના માધ્યમ પર tuple નું બિલકુલ binary સરનામું હોય છે. એ ચાર ચોક્કસ સંરચનાત્મક ભાગોમાં વહેંચાયેલી 18-અક્ષરની base-64 string તરીકે દર્શાવાય છે.
Theory
એક Extended ROWID નું શરીરરચનાશાસ્ત્ર
એક extended ROWID OOOOOOFFFBBBBBBRRR જેવા અક્ષરોના ક્રમ જેવો દેખાય છે. ચાલો તોડીએ કે દરેક ટુકડો database engine ને શું ઉજાગર કરે છે:
At a glance
Table 1: Oracle Extended ROWID strings નું માળખાકીય વિભાજન.
| ROWID ના ટુકડાના અક્ષરો | દર્શાવાયેલો ઘટક | ભૌતિક સંગ્રહનું કાર્ય |
|---|---|---|
અક્ષર 1 - 6 (OOOOOO) | Data Object Number | ચોક્કસ database segment/table ના માળખાની id ઓળખે છે. |
અક્ષર 7 - 9 (FFF) | Relative Datafile Number | સંગ્રહની drive પરની બિલકુલ ભૌતિક operating system ની file તરફ ઈશારો કરે છે. |
અક્ષર 10 - 15 (BBBBBB) | Data Block Number | હરોળનો data રાખતો ચોક્કસ memory ફાળવણીનો block પકડે છે. |
અક્ષર 16 - 18 (RRR) | Row Slot Number | એ ચોક્કસ block ની અંદરના બિલકુલ directory index ખાનાનું સ્થાન ઓળખે છે. |
Theory
સાર્વત્રિક ચબરખી: DUAL Table
DUAL table એ Oracle દ્વારા data dictionary સાથે આપોઆપ બનાવાયેલું એક ખાસ, એક-હરોળનું, એક-column નું નકલી table છે. એ schema user SYS નું છે પણ public privilege હેઠળ બધા database users વૈશ્વિક રીતે વાપરી શકે છે. એમાં VARCHAR2(1) તરીકે વ્યાખ્યાયિત બિલકુલ એક column છે જેનું નામ DUMMY છે, અને એ 'X' value વાળી એક જ હરોળ રાખે છે. કારણ કે એમાં બિલકુલ એક જ હરોળ છે, તમે એની સામે બોલાવો એ કોઈ પણ function કે સમીકરણ બિલકુલ એક જ વાર આંકાય છે, જે એને expressions ચકાસવા આદર્શ બનાવે છે.
Practical
Executing Lookups and Testing Functions
-- 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
એક-હરોળના મૂલ્યાંકનનો નિયમ
જો તમે 'SELECT SYSDATE FROM DUAL;' ચલાવવાને બદલે 500 student rows ધરાવતા એક table પર 'SELECT SYSDATE FROM student_profile;' query ચલાવો તો શું થાય?
Show the answer
Query સફળતાપૂર્વક ચાલશે, પણ એ બિલકુલ એ જ system ની તારીખ 500 અલગ વાર છાપી નાખશે! કેમ? કારણ કે SQL statements હંમેશા લક્ષ્ય table માં અસ્તિત્વ ધરાવતી દરેક હરોળ માટે એક output લીટી પાછી આપે છે. બિલકુલ આ જ કારણે DUAL table માત્ર 1 હરોળ સાથે રચાયું હતું: એ ખાતરી આપે છે કે તમને database ના buffers બિનજરૂરી દોહરાવાયેલી લખાણની લીટીઓથી ભર્યા વગર બિલકુલ એક સાફ પરિણામની લીટી પાછી મળે.
Quiz
જો તમે એક UPDATE statement ચલાવો જે એક student ના નામની value બદલે, તો એ ચોક્કસ row record ની ROWID value નું શું થાય છે?
- ROWID તરત બદલાય છે કારણ કે હરોળની સામગ્રી એક નવા memory segment માં ફરીથી લખાય છે.
- ROWID સંપૂર્ણપણે અછૂતું રહે છે કારણ કે સંગ્રહના disk block પર હરોળનું ભૌતિક સ્થાન એનું એ જ રહે છે.
- એક COMMIT trigger થાય ત્યાં સુધી હરોળને એક કામચલાઉ null value સોંપાય છે.
- System હરોળનું ખાનું સંપૂર્ણપણે કાઢી નાખે છે અને એક નવો database object id બનાવે છે.
Show the answer
ROWID સંપૂર્ણપણે અછૂતું રહે છે કારણ કે સંગ્રહના disk block પર હરોળનું ભૌતિક સ્થાન એનું એ જ રહે છે.
ROWID એ disk પર એક હરોળનું ભૌતિક સંગ્રહનું સ્થાન ઓળખે છે. Columns ની અંદરની data ની values બદલવાથી (જેમ કે એક નામની string બદલવી) હરોળ disk પર ભૌતિક રીતે ક્યાં બેસે છે એ બદલાતું નથી. તેથી, ROWID સંપૂર્ણપણે નિશ્ચિત અને અચળ રહે છે.
Quiz
નીચેનામાંથી કયું વર્ણન Oracle ના આંતરિક DUAL table ના સંરચનાત્મક ઘટકોને સચોટ રીતે વ્યાખ્યાયિત કરે છે?
- એમાં 2 columns અને 2 rows છે, જે ગણતરીના parameters બે વાર તપાસવા રચાયેલાં છે.
- એમાં 0 columns અને 1 હરોળ છે, જે વહીવટી કામો માટે એક placeholder ડબ્બા તરીકે કામ કરે છે.
- એમાં DUMMY નામનો બિલકુલ 1 column અને 'X' value વાળી બિલકુલ 1 હરોળ છે.
- એ એક કામચલાઉ view છે જે તમારું session બંધ થતાં જ અદૃશ્ય થઈ જાય છે.
Show the answer
એમાં DUMMY નામનો બિલકુલ 1 column અને 'X' value વાળી બિલકુલ 1 હરોળ છે.
DUAL table સ્થિર રીતે એક ખરેખરા table તરીકે રચાયેલું છે જેમાં એક column (DUMMY) અને 'X' અક્ષરની value રાખતી બિલકુલ એક હરોળ છે. આ સંરચનાત્મક ગોઠવણ ખાતરી કરે છે કે એની સામે આંકાયેલું કોઈ પણ scalar function કે expression એક જ અનન્ય હરોળની output લીટી પાછી આપે.
Watch out
Classic ફાંદો: બેવડી હરોળ કાઢવાનો ગૂંચવાડો
University interviews માં એક ખૂબ લોકપ્રિય અને પેચીદો પ્રશ્ન છે: 'જો બે એકસરખી બેવડી rows બધા columns પર બિલકુલ એકસરખી values ધરાવતી હોય તો તમે એમને એક table માંથી કેવી રીતે કાઢો?' તમે એમને નામ કે roll numbers વાપરીને filter કરી શકતા નથી કારણ કે એ સંપૂર્ણપણે મળે છે! ઉકેલ છે ROWID વાપરવો. બે rows માણસને એકસરખી લાગે તો પણ, એમની ROWID strings અલગ હોવાની ખાતરી છે કારણ કે એ જુદાં ભૌતિક ખાનાંમાં રહે છે. બેવડી rows સલામત રીતે સાફ કરવા તમે આવી query લખી શકો: DELETE FROM students A WHERE A.rowid > (SELECT MIN(B.rowid) FROM students B WHERE A.roll_no = B.roll_no);
Theory
Semester 3 Performance Optimization સાથે જોડાણ
ROWID સમજવાથી તમને તમારા અદ્યતન Semester 3 ના database performance ના modules માટે મોટી શરૂઆતી લીડ મળે છે. જ્યારે તમે એક સ્પષ્ટ Database Index બનાવો, Oracle એક ઝડપી lookup નું વૃક્ષ બનાવે છે જે શોધની ચાવીઓને સીધી એમની અનુરૂપ ROWID values સાથે map કરે છે. આ storage engine ને ધીમા આખા-table ના સંગ્રહના scans છોડીને તરત બિલકુલ disk ના સ્થાને કૂદવા દે છે.
Summary
Key takeaways
- ROWID એ એક આંતરિક Oracle pseudo-column છે જે disk ના સંગ્રહ પર એક હરોળનું બિલકુલ ભૌતિક સરનામું ખુલ્લું કરે છે.
- એક extended ROWID એ base-64 encoded string છે જેમાં Object ID, Relative Datafile number, Block ID, અને Row Slot હોય છે.
- DUAL table એ એક built-in એક-હરોળ, એક-column નું table છે જે expressions ચકાસવા ઝડપી ચબરખી તરીકે વપરાય છે.
- DUAL સામે functions query કરવાથી ખાતરી થાય છે કે values (જેમ કે SYSDATE કે ગણિતની logic) બિલકુલ એક જ વાર આંકાય.
- ROWIDs સંરચનાત્મક ફેરફારો દરમિયાન સ્થિર રહે છે, સિવાય કે હરોળ ભૌતિક રીતે કઢાય કે ખસેડાય.
- Memory Hook: ROWID એ તમારી હરોળના ભૌતિક સંગ્રહના સરનામાનો થપ્પો છે, અને DUAL તમારી સલામત, એક-હરોળની કાચા કામની ચબરખી છે!