در نوشته معماری اوراکل – ساختار منطقی اوراکل گفتیم که Data Block کوچکترین واحد واگذاری فضای ذخیره سازی درون اوراکل است. Data Block همانی است که شی های پایگاه داده بر روی آنها نگهداری می شوند و اندازه آنها ۲ کلیوبایت یا ۴ کیلوبایت یا ۸ کیلو بایت یا ۱۶ کیلو بایت یا در برخی کاربردهای ویزه تا ۳۲ کیلو بایت نیز است. البته باز هم در این باره نیز شاید سیستم عامل به کار رفته، تنگنایی را بر روی اندازه بلاک ها داشته باشد.

برای نمونه زمانی که دستور SELECT را اجرا می کنید، اورکل داده ها را در غالب واحدهایی به اندازه پارامتر DB_BLOCK_SIZE از Data File ها می خواند. در سطح فیزیکی داده ها بر روی بلاک های دیسک و درون Data File ها نگهداری می شوند. بنابراین می توانیم نتیجه بگیریم که از دید ساختار فیزیکی، داده ها بر روی Data File ها و بر روی بلاک های دیسک ذخیره شده اند و از دید ساختار منطقی، Data Block کوچکترین واحدی است که اوراکل می خواند یا می نویسد.

همانطور که گفتیم هر فablespace شامل سگمنت (Segment) و هر سگمنت نیز شامل چندین Extent است و خود Extent ها نیز شامل بلاک های منطقا به هم پیوسته هستند. در زمان ایجاد Tablespace می توانیم اندازه بلاک های آنرا تعیین کنیم ولی اگر این کار انجام نشود، اوراکل از مقدار پیشفرض پارامتر DB_BLOCK_SIZE برای اندازه بلاک های Tablespace استفاده می کند.

بلاک های با چندین اندازه

از اوراکل 9i به بالا، می توانیم Tablespace ها با Data Block ها با اندازه های متفاوت ایجاد کنیم. برای نگهداری شی هایی بزرگی مانند جدول ها و ایندکس ها (Index) پیشنهاد می شود Tablespace هایی جداگانه با Data Block های بزرگتر به کار گرفته شود. کاربرد ویژه Data Block های بزرگتر، در سامانه (سیستم) پشتیبانی تصمیم (Decision Support System یا DSS) و OLAP و انبار داده (Data Warehouse یا DW) است ولی در سامانه های تراکنشی رایج OLTP (همین کاربرد رایج اوراکل یا MySQL یا SQL Server و ههر پایگاه داده دیگری) است. 

کاربرد مهم دیگری پیشتیبانی از بلاک ها با چندین اندازه (Multiple Block Sizes) در انتقال (Transport) دادن یک Tablespace از سیستم عامل به دیگری با اندازه بلاک متفاوت است. در نوشته های پیش رو Tablespace Transport آموزش داده شده است. هر سیستم عامل (مانند ویندوز، لینوکس، سولاریس و دیگر سیستم عامل های یونیکسی) اندازه بلاک ویژه خودش را دارد.

اندازه بلاک دلخواه برای Tablespace

اندازه Tablespace های SYSTEM و SYSAUX برابر با پارامتر BB_BLOCK_SIZE است. همه دیگر بلاک هایی که ایجاد می کنید، اندازه بلاک آنها برابر با همین پارامتر است مگر که پارامتر BLOCKSIZE را در دستور CREATE TABLESPACE به کار ببرید. در دستور زیر می توانید ببینید که بوسیله پارامتر BLOCKSIZE در CREATE TABLESPACE اندازه بلاک برای این Tablespace برابر با 8K یا ۸ کیلو بایت گزینش شده است.

برای آن که بخش BLOCKSIZE با کامیابی (موفقیت) انجام شود، باید دست کم یکی از پارامترهای DB_nK_CACHE_SIZE را بر پایه نیاز مقداردهی کرده باشید. چناچه پارامتر دلخواه DB_nK_CACHE_SIZE مقدار دهی نشده باشد، پس خطای زیر در زمان ایجاد Tablespace با اندازه بلاک متفاوت از اندازه پیش فرض، نشان داده می شود.

پارامتر DB_CACHE_SIZE به اندازه ناحیه Buffer Cache در SGA (حافظه اصلی) برای اندازه استاندارد بلاک اشاره دارد که پیش از این در نوشته معماری اوراکل – ساختار SGA – بخش نخست مفهوم Buffer Cache را آموزش داده بودم. بنابراین در دستور CREATE TABLESPACE بالا چون می خواهید Tablespace را با بلاک ۸ کیلوبایتی ایجاد کنید، پس باید پارامتر DB_8K_CACHE_SIZE برای بافر کَش ۸ کیلوبایتی، مقدار دهی کنید. باز هم می گویم که DB_CACHE_SIZE مقدار بافر برای اندازه استاندارد Data Block را نشان می دهد و برای اندازه های دیگر باید یکی از پارامترهای DB_nK_CACHE_SIZE را مقدار دهی کنید که n برابر با اندازه بلاک (در این نوشته ۸ کیلو بایت) است.

در دستور زیر و بوسیله ALTER SYSTEM SET اندازه بافر کَش برای بلاک های ۸ کیلوبایتی را برابر با ۳۰۰ مگابایت گرفته ام. ولی چرا باید بافر کَش را برای بلاک های با اندازه متفاوت، مقدار دهی کنیم. اگر نوشته های معماری اوراکل در باره SGA و فرایند DBwn را به یاد داشته باشید، گفتیم که نخست داده ها از Data File ها به درون Buffer Cache آورده می شوند و درون این بخش تغییر پیدا کرده و سپس روی Data File ها و بوسیله فرایند DBWn نوشته می شوند. پس نیاز است اندازه بلاک های حافظه با اندازه Data Block های یک Tablespace و یکسان باشند.