پیش از این در مورد instance و معماری حافظه در اوراکل صحبت کردیم. instance که از فرایندهای پس زمینه و فضای SGA تشکیل شده است که در حافظه اصلی مقیم هستند. اما پایگاه داده در اوراکل به چه صورت است؟ داده های جداول در کجا ذخیره می شوند؟ کدام فایل ها در اوراکل در ارتباط با یک پایگاه داده هستند و بر روی دیسک ذخیره شده اند؟

توجه کنید که منظور ما از واژه پایگاه داده یعنی مجموعه ای فایل های فیزیکی هستند که بر روی دیسک ذخیره شده اند. در ادامه می خواهیم با دو مفهوم ساختار منطقی اوراکل (logical structure) و ساختار فیزیکی اوراکل (physical structure) صحبت کنیم.

اگر مطالب قبلی را به درستی به یاد داشته باشید در مورد یک نوع از فایل ها صحبت کردیم، که دیتا فایل (data file) نامیده می شوند. گفتیم که هر تغییری ابتدا درون فضای buffer cache رخ می دهد و سپس اثر هر تغییر به  صورت رکورد redo درون فضای redo log buffer اعمال می شود. طبق معماری هر پایگاه داده ای که اول هر تغییری باید لاگ (log) شود، پس رکوردهای redo اول درون فایل های فیزیکی به نام redo log ذخیره می شوند و در نهایت بلاک های buffer cache به درون دیتا فایل ها نوشته (ذخیره) می شوند  که دیتا فایل نیز بر روی دیسک قرار دارند.

پس تا به اینجا به دو نوع از فایل هایی که یک پایگاه داده را تکشیل می دهند. این فایل ها، دیتا فایل و online redo log نام دارند. در این مطلب نمی خواهیم در مورد این فایل ها صحبت کنیم، بلکه می خواهیم مفهوم دیگری به نام ساختار منطقی اوراکل را توضیح دهیم. در شکل زیر (شکل ۱) دو ساختار فیزیکی و منطقی اوراکل را با یکدیگر مقایسه شده اند. همانطور که می بینید ساختار منطقی از چهار بخش تشکیل شده است که عبارتند از:

۱ – tablespace

۲ – segment

۳ – extent

۴ – data block

Tablespace در اوراکل – پیش گفتار

Tablespace در اوراکل – ایجاد

Data Block

در پایین ترین سطح ساختار منطقی data block ها قرار دارند. دیتا فایل ها، بر روی دیسک ذخیره می شوند و داده ها را بر روی بلاک های سیستم عامل ذخیره می کند. در مفاهیم سیستم عامل، بلاک کوچکترین واحدی است که توسط سیستم عامل خوانده یا نوشته می شود.

در اواکل نیز به همین صورت است. data block کوچکترین واحدی است که خوانده و نوشته می شود. اندازه data block ها بر مبنای توان ۲ و از ۸ کلیو بایت تا ۶۴ کیلیو بایت است. شکل زیر (شکل ۳) رابطه میان بلاک های سیستم عامل و data block های اوراکل را نشان می دهد.

 

فرض کنید اوراکل درون سیستم عامل لینوکس و بر روی سیستم فایل ext4 نصب شده است. اندازه بلاک ها در این حالت برابر با یک کلیو بایت است. همچنین اندازه data block ها به صورت پیشفرض ۸ کیلوبایت است، پس اوراکل در هر بار خواندن یا نوشتن، ۸ کلیو بایت را می نویسد یا می خواند و این ۸ کلیوبایت به بلاک های یک کلیوبایتی و بر روی دیسک شکسته می شود.

چگونه اندازه بلاک های سیستم فایل ext4 را پیدا کنیم

برای این کار دستور زیر را با مجوز root اجرا کنید. فقط به جای device_name باید نام دیسک را قرار دهید. به طور مثال می تواند dev/sda1/ باشد.

چگونه اندازه بلاک های اوراکل را پیدا کنیم

پارامتری به نام db_block_size وجود دارد که اندازه فعلی بلاک های اوراکل را نشان می دهد. برای نمایش مقدار آن باید دستور زیر را اجرا کنید.

چگونه اندازه بلاک اوراکل را تغییر دهیم

اولا اگر پارامتر db_block_size مقدار دهی نشده باشد، پس به صورت پیشفرض مقدار آن برابر با اندازه بلاک سیستم عامل می شود. گفتیم که اندازه بلاک اوراکل از ۴ کیلوبایت تا ۶۴ کلیوبایت است ولی به طور معمول اندازه آن برابر با ۴ کلیوبایت یا ۸ کیلوبایت خواهد بود.

برای تغییر اندازه بلاک اوراکل باید از دستور alter system set استفاده کنیم تا پارامتر db_block_size را تنظیم مقدار کنیم. به طور مثال فرض کنید اندازه آن از قبل تعیین نشده و ما می خواهیم آنرا برابر با ۸ کیلوبایت قرار دهیم.

Extents

همانطور که گفتیم data block ها کوچکترین واحدی هستند که اوراکل می خواند یا می نویسد. هر extent شامل چندین بلاک منطقا به هم پیوسته است. توجه کنید که بلاک های اوراکل درون extent منطقا به هم پیوسته هستند ولی ممکن است از نظر فیزیکی و بر روی دیسک، از هم گسسته باشند.

زمانی که یک جدول ایجاد می کنید، اوراکل یک سگمنت (segment یا data segment) را به جدول اختصاص می دهد و در همین لحظه یک extent اولیه (یا initial extent) را به سگمنت جدول اختصاص می دهد. توجه کنید که هنوز هیچ سطری درون جدول درج (insert) نشده است، ولی اوراکل تعداد بلاک هایی را در غالب یک extent اولیه برای سگمنت جدول رزرو (reserve) کرده است.

بنابراین اوراکل در زمان ایجاد جدول برای فراهم کردن امکان درج سطرها در زمان آینده یک گروه از data block ها را در غالب extent اولیه برای سگمنت جدول رزرو می کند تا درج سطرها برای جدول بدون مشکل باشد. فعلا بحث اختصاص و بازپسگیری extent را رها می کنیم و در مطالب مربوط به tablespace مجدد توضیح خواهیم داد.

هر زمان که بلاک های extent اولیه که به جدول اختصاص داده شده است به اتمام برسد، و نیاز به بلاک های جدید برای داده های جدید باشد، اوراکل به صورت خودکار incremental extent را به سگمنت اختصاص می دهد. incremental extent مجموعه ای از extent ها است که به سگمنت اعطا می شوند و ممکن است اندازه آن مساوی یا بیشتر از initial extent باشد.

Segments

یک سگمنت مجموعه ای از extent ها است. در ساختار منطقی هر tablespace از تعدادی سگمنت و هر سگمنت نیز از تعدادی extent و هر extent نیز از data block های به هم پیوسته تشکیل شده است. سگمنت ها انواع مختلفی دارند. شکل زیر (شکل ۴) نمای کلی رابطه میان  data block و extent و segment را نشان می دهد.

به طور مثال زمانی که یک جدول را ایجاد می کنیم، یک data segment به جدول اختصاص داده می شود و در مقبابل هر زمان که یک ایندکس (index) را ایجاد می کنیم، یک index segment به ایندکس اختصاص داده می شود. به طور کلی می توانیم سگمنت ها را به دسته های زیر تقسیم کنیم:

۱ – data segment

۲ – index segment

۳ – temporary data segment

۱ – data segment

data segment نوعی از سگمنت ها است که درون آن داده های موارد زیر نگهداری می شود. به طور کلی هر زمان که یک جدول یا یک کلاستر (cluster) توسط دستور create ایجاد شود، اوراکل به صورت خودکار یک data segment اختصاص می دهد.

  • جدول هایی پارتیشن بندی یا کلاستر بندی نشده اند.
  • پارتیشن از یک جدول پارتیشن بندی شده
  • کلاستری از جدول ها

۲ – index segment

هر زمان که یک ایندکس پارتیشن بندی نشده ایجاد می شود، اوراکل به صورت خودکار یک index segment را برای نگهداری داده های آن، اختصاص می دهد. در مقابل برای هر ایندکس پارتیشن بندی شده، هر پارتیشن دارای یک index segment خاص خودش است. هر زمان که توسط دستور create index یک ایندکس یا ایندکس پارتیشن بندی شده ایجاد کنیم، اوراکل index segment را در اختیار آن قرار می دهد.

۳ – Temporary Segment

اوراکل برای اجرا و پردازش کوئری های پیچیده نیاز به یک فضا دارد. اوراکل برای این منظور قسمتی از فضای دیسک را به کوئری اختصاص می دهد که آنرا temporary segment می نامیم. اما اگر مرنب سازی در همان فضای حافظه قابل انجام شدن باشد، به عبارت دیگر اگر فضای حافظه کافی باشد، اوراکل دیگر temporary segment را اختصاص نمی دهد. فهرست زیر تعدادی از دستورهایی که به این سگمنت نیاز دارند را فهرست کرده است.

  • CREATE INDEX
  • SELECT … ORDER BY
  • … SELECT DISTINCT
  • SELECT … GROUP BY
  • SELECT . . . UNION
  • SELECT … INTERSECT
  • SELECT … MINUS