دیتابیس اوراکل 12.1.0.2c:Cache اتوماتیک جداول بزرگ (Big Tables)

خواندن مسیر مستقیم سریال (مستقیم از دیسک) ابتدا در Oracle 11g ارائه شد تا از پاک شدن تعداد زیادی از بافرها از Buffer Cache که با اسکن سریال جداول بزرگ رخ می دهد، جلوگیری گردد. در نتیجه، جداول بزرگ قابل دسترسی از طریق سری اسکن کامل جداول، Buffer Cache را دور می زنند و داده های Datafile ها را از داخل PGA کاربران می خوانند. این مانع از Flooding در Buffer Cache می شود ، اما SELECT های بعدی روی جدول بزرگ همیشه به دیسک دسترسی پیدا می کنند و بدین ترتیب کارایی یا Performance را پایین می آورند.

اگر به یک جدول بزرگ مدام با استفاده از سریال FTS (Full-Text-Searches) دسترسی پیدا کنید ، بهتر است از خواندن مکرر دیسک در طول اسکن کامل سریال جداول بعدی خودداری کنید، که با توجه به نسخه اوراکل شما چند گزینه وجود دارد. قبل از نسخه 12.1.0.2c، داده های جداول بزرگ را می توان با استفاده از دو روش ذیل در Buffer Cache ذخیره کرد:

استفاده از Cache:
اگر یک جدول آپشن cache را روی خود داشته باشد و بصورت کامل اسکن شده باشد، بلاکهای بازیابی شده در انتهای آخرین لیست استفاده شده LRU (Least Recently Used) ، در Buffer Cache پیش فرض قرار می گیرند. اگرچه این باعث می شود که کمتر در معرض منسوخ شدن قرار بگیرند، اما ممکن است در صورت نیاز داشتن به فضا، بلاکهای جدول Cache شده از حافظه CACHE برداشته شود. از آنجا که بلاکهای جداول Cache شده در Buffer Cache پیش فرض قرار می گیرند ، احتمال دارد توسط بلاکهای جداول دیگر که بدون آپشن CACHE می باشند و به Buffer Cache پیش فرض اختصاص داده شده اند، تخلیه و اخراج شوند.

استفاده از Keep pool:
این عامل باعث می شود که بلاک های جداول خاصی در یک قسمت حافظه جداگانه از Buffer Cache با نام (Keep Pool) اختصاص داده شود. از آنجا که Keep Pool جزئی از Buffer Cache پیش فرض نمی باشد، آبجکتهای اختصاص داده شده به KEEP Pool با Object های موجود در Buffer Cache پیش فرض تداخل ندارند. با این حال، رفتار LRU در KEEP Pool همانند LRU در Buffer Cache پیش فرض است، بنابراین اگر ظرفیت KEEP Pool کوچکتر از تعداد بلاکی باشد که نگهداری می شود ، ضرورتا برخی از بلاک ها از روی حافظه Cache منسوخ و پاک می شوند.

هر دو آپشن بالا:

از آنجا که، قبل از نسخه 12.1.0.2cهیچ روشی وجود نداشت که به شما امکان دهد به طور خودکار جداول بزرگ بصورت مداوم به حافظه دسترسی پیدا کنید. دیتابیس اوراکل نسخه 12.1.0.2c، Automatic big table cache (ABTC) را معرفی می کند که:

پیکربندی ABTC:

درصد اندازه Cache Buffer مورد استفاده برای ذخیره خودکار جدول بزرگ را می توان با استفاده از پارامتر اولیه DB_BIG_TABLE_CACHE_PERCENT_TARGET تنظیم کرد. پیش فرض صفر (غیرفعال) و حد بالا 90 است ، به طوری که حداقل 10٪ از Buffer Cache برای ذخیره آبجکتهای غیر از آبجکتهای بزرگ استفاده می گردد. بر اساس تغییرات Workload در سطح دیتابیس می توان این پارامتر را به صورت Dynamic تغییر داد.

در حالی که در پیکربندی Single Instance، ABTC تنها با تنظیم پارامتر DB_BIG_TABLE_CACHE_PERCENT_TARGET به مقدار غیر صفر پیکربندی می شود ، در پیکربندی Oracle Real Application Clusters یا به اختصار (Oracle RAC)، بایستی پارامتر PARALLEL_DEGREE_POLICY نیز به AUTO تنظیم شود.
Dynamic Performance View های مرتبط با ABTC:

در این مقاله ، ABTC را برای اسکن سریال در پایگاه داده Single instance 12.1.0.2C نشان خواهیم داد.

– ابتدا سایز Buffer Cache پیش فرض و تعداد بافرهای موجود در آن را بررسی کنید.

SQL> select COMPONENT, CURRENT_SIZE/1024/1024 SIZE_MB

from v$sga_dynamic_components

where component = ‘DEFAULT buffer cache’;

COMPONENT SIZE_MB

DEFAULT buffer cache 148

SQL> SELECT name,block_size,buffers FROM v$buffer_pool;

NAME BLOCK_SIZE BUFFERS

DEFAULT

FORCE_FULL_DB_CACHING

NO

Parameter Description Value

_db_block_buffers Number of database blocks cach 19600

ed in memory: hidden parameter

_small_table_threshold lower threshold level of table 392

size for direct reads

SQL> Select blocks from dba_tables where table_name = ‘BIG_TABLE1’;

BLOCKS

3928

SQL>alter system set db_big_table_cache_percent_target=0 scope=both;

Show parameter DB_BIG_TABLE_CACHE_PERCENT_TARGET

NAME TYPE VALUE

db_big_table_cache_percent_target string 0

SQL> select BT_CACHE_TARGET, OBJECT_COUNT, MEMORY_BUF_ALLOC, MIN_CACHED_TEMP from v$bt_scan_cache;

BT_CACHE_TARGET OBJECT_COUNT MEMORY_BUF_ALLOC MIN_CACHED_TEMP

0 0 0 1000

VALUE

1

SQL>set autot traceonly statistics

select count(*) from hr.big_table1;

set autot off

Statistics

0 recursive calls

0 db block gets

3861 consistent gets

3858 physical reads

0 redo size

542 bytes sent via SQL*Net to client

551 bytes received via SQL*Net from client

2 SQL*Net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

1 rows processed

SQL> select value from v$mystat

where statistic#= (select statistic# from v$statname

where name=’table scans (direct read)’);

VALUE

2

SQL>set autot traceonly statistics

select count(*) from hr.big_table1;

set autot off

Statistics

0 recursive calls

0 db block gets

3861 consistent gets

3858 physical reads

0 redo size

542 bytes sent via SQL*Net to client

551 bytes received via SQL*Net from client

2 SQL*Net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

1 rows processed

SQL> select BT_CACHE_TARGET, OBJECT_COUNT, MEMORY_BUF_ALLOC, MIN_CACHED_TEMP from v$bt_scan_cache;

BT_CACHE_TARGET OBJECT_COUNT MEMORY_BUF_ALLOC MIN_CACHED_TEMP

65 0 0 1000

SQL> Select object_name, size_in_blks, temperature, policy, cached_in_mem

from v$bt_scan_obj_temps b, dba_objects o where b.dataobj# = o.data_object_id;

no rows selected

SQL>select count() from hr.departments; SQL> select count() from hr.employees;

SQL>select count() from hr.locations; SQL>select count() from hr.countries;

SQL> select BT_CACHE_TARGET, OBJECT_COUNT, MEMORY_BUF_ALLOC, MIN_CACHED_TEMP from v$bt_scan_cache;

BT_CACHE_TARGET OBJECT_COUNT MEMORY_BUF_ALLOC MIN_CACHED_TEMP

65 0 0 1000

SQL> select BT_CACHE_TARGET, OBJECT_COUNT, MEMORY_BUF_ALLOC, MIN_CACHED_TEMP

from v$bt_scan_cache;

BT_CACHE_TARGET OBJECT_COUNT MEMORY_BUF_ALLOC MIN_CACHED_TEMP

65 1 3928 1000

SQL> Select object_name, size_in_blks, temperature, policy, cached_in_mem from

v$bt_scan_obj_temps b, dba_objects o where b.dataobj# = o.data_object_id;

OBJECT_NAME SIZE_IN_BLKS TEMPERATURE POLICY CACHED_IN_MEM

BIG_TABLE1 3928 1000 MEM_ONLY 3928

Elapsed: 00:00:00.02

Statistics

1 recursive calls

0 db block gets

3865 consistent gets

0 physical reads

0 redo size

542 bytes sent via SQL*Net to client

551 bytes received via SQL*Net from client

2 SQL*Net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

1 rows processed

SQL> Select object_name, size_in_blks, temperature, policy, cached_in_mem

from v$bt_scan_obj_temps b, dba_objects o where b.dataobj# = o.data_object_id;

OBJECT_NAME SIZE_IN_BLKS TEMPERATURE POLICY CACHED_IN_MEM

BIG_TABLE1 3928 2000 MEM_ONLY 3928

• تعداد بافرهای اختصاص داده شده به Object در ABTC = 2 برابر سایز بلاکهای HR.big_table1 = 3928×2 = 7856
• HR.big_table2 به طور کامل در ABTC بارگذاری شده است (POLICY = MEM_ONLY و SIZE_IN_BLKS = CACHED_IN_MEM) با درجه حرارت 1000.
• درجه حرارت HR.big_table1 به 3000 افزایش یافته است.
• هر دو Table بطور کامل در ABTC قرار گرفته اند.

SQL>create table hr.big_table2 as select * from hr.big_table1;

Select count(*) from hr.big_table2;

SQL> select BT_CACHE_TARGET, OBJECT_COUNT, MEMORY_BUF_ALLOC, MIN_CACHED_TEMP from

v$bt_scan_cache;

BT_CACHE_TARGET OBJECT_COUNT MEMORY_BUF_ALLOC MIN_CACHED_TEMP

65 2 7856 1000

SQL> Select object_name, size_in_blks, temperature, policy, cached_in_mem

from v$bt_scan_obj_temps b, dba_objects o where b.dataobj# = o.data_object_id;

OBJECT_NAME SIZE_IN_BLKS TEMPERATURE POLICY CACHED_IN_MEM

BIG_TABLE1 3928 3000 MEM_ONLY 3928

BIG_TABLE2 3928 1000 MEM_ONLY 3928

• درجه حرارت HR.big_table1 به 4000 افزایش یافته است، زیرا که زمان ایجاد جدول HR.big_table3 در دسترس قرار می گیرد.
• دمای HR.big_table3 2000 می باشد زیرا دو بار به آن دسترسی پیدا می کنید – در هنگام insert و همچنین در حین select.
• HR.big_table3 تا حدی در ABTC بارگیری می شود (POLICY = MEM_PART و SIZE_IN_BLKS> CACHED_IN_MEM).
• جدولHR.big_table3 باعث اخراج جدول HR.big_table2 (POLICY = DISK) شده است، زیرا HR.big_table2 دارای کمترین دما (1000) در میان هر 3 جدول در ABTC می باشد.
• اگرچه HR.big_table2 از Cache خارج شده است، اما همچنان کاندید ABTC می باشد. به محض افزایش دمای آن یا وجود بافرهای آزاد در ABTC، به طور خودکار از دیسک به ABTC خوانده می شود.

SQL>create table hr.big_table3 as select * from hr.big_table1;

Insert into hr.big_table3 select * from hr.big_table3;

Select count(*) from hr.big_table3;

SQL> select BT_CACHE_TARGET, OBJECT_COUNT, MEMORY_BUF_ALLOC, MIN_CACHED_TEMP from

v$bt_scan_cache;

BT_CACHE_TARGET OBJECT_COUNT MEMORY_BUF_ALLOC MIN_CACHED_TEMP

65 3 11784 1000

SQL> Select object_name, size_in_blks, temperature, policy, cached_in_mem

from v$bt_scan_obj_temps b, dba_objects o where b.dataobj# = o.data_object_id;

OBJECT_NAME SIZE_IN_BLKS TEMPERATURE POLICY CACHED_IN_MEM

BIG_TABLE1 3928 4000 MEM_ONLY 3928

BIG_TABLE2 3928 1000 DISK 3928

BIG_TABLE3 7874 2000 MEM_PART 7856

• دمای hr.big_table2 از 1000 به 3000 افزایش یافته است.

• HR.big_table2 به طور خودکار به طور کامل در حافظه بارگذاری می شود در حالی که قسمت بیشتر از hr.big_table3 ، با دمای پایین تر (2000) را به دیسک می راند.

SQL> select count() from hr.big_table2; SQL> select count() from hr.big_table2;

SQL> Select object_name, size_in_blks, temperature, policy, cached_in_mem

from v$bt_scan_obj_temps b, dba_objects o where b.dataobj# = o.data_object_id;

OBJECT_NAME SIZE_IN_BLKS TEMPERATURE POLICY CACHED_IN_MEM

BIG_TABLE1 3928 4000 MEM_ONLY 3928

BIG_TABLE2 3928 3000 MEM_ONLY 3928

BIG_TABLE3 7874 2000 MEM_PART 3928

SQL>alter system set db_big_table_cache_percent_target = 90;

select BT_CACHE_TARGET, OBJECT_COUNT, MEMORY_BUF_ALLOC, MIN_CACHED_TEMP from

v$bt_scan_cache;

BT_CACHE_TARGET OBJECT_COUNT MEMORY_BUF_ALLOC MIN_CACHED_TEMP

90 3 11784 1000

SQL> Select object_name, size_in_blks, temperature, policy, cached_in_mem

from v$bt_scan_obj_temps b, dba_objects o where b.dataobj# = o.data_object_id;

OBJECT_NAME SIZE_IN_BLKS TEMPERATURE POLICY CACHED_IN_MEM

BIG_TABLE1 3928 4000 MEM_ONLY 3928

BIG_TABLE2 3928 3000 MEM_ONLY 3928

BIG_TABLE3 7874 2000 MEM_ONLY 7874

SQL> alter system set db_big_table_cache_percent_target = 95;

alter system set db_big_table_cache_percent_target = 95

*

ERROR at line 1:

ORA-02097: parameter cannot be modified because specified value is invalid

ORA-00068: invalid value 95 for parameter db_big_table_cache_percent_target, must be between 0 and 90

SQL>alter system set db_big_table_cache_percent_target =65;

Select object_name, size_in_blks, temperature, policy, cached_in_mem

from v$bt_scan_obj_temps b, dba_objects o where b.dataobj# = o.data_object_id;

OBJECT_NAME SIZE_IN_BLKS TEMPERATURE POLICY CACHED_IN_MEM

BIG_TABLE1 3928 4000 MEM_ONLY 3928

BIG_TABLE2 3928 3000 MEM_ONLY 3928

BIG_TABLE3 7874 2000 MEM_PART 3928

SQL> alter system flush buffer_cache;

Select object_name, size_in_blks, temperature, policy, cached_in_mem

from v$bt_scan_obj_temps b, dba_objects o where b.dataobj# = o.data_object_id;

OBJECT_NAME SIZE_IN_BLKS TEMPERATURE POLICY CACHED_IN_MEM

BIG_TABLE1 3928 4000 MEM_ONLY 3928

BIG_TABLE2 3928 3000 MEM_ONLY 3928

BIG_TABLE3 7874 2000 MEM_PART 3928

خلاصه:
Oracle Database 12.1.0.2c ویژگی Cache جداول بزرگ خودکار (ABTC) را معرفی می کند که:

– به صورت خودکار آبجکتهای بزرگ اسکن شده را در Cache جداول بزرگ نگه می دارد، به این ترتیب که یک قسمت اختیاری از Buffer Cache برای ذخیره اشیاء بزرگ رزرو شده است ، در نتیجه از خواندن مسیر مستقیم (خواندن مستقیم از دیسک) جلوگیری می شود.
– فقط جدولهای بزرگ را ردیابی می کند و هیچ جدول کوچکی را شامل نمی شود.
– از الگوریتم جایگزینی temperature-based, object-level (مبتنی بر دما و سطح آبجکت) برای مدیریت محتویات حافظه بزرگ جدول به جای الگوریتم جایگزینی سنتی مبتنی بر LRU و سطح بلاک استفاده می کند که توسط Buffer Cache استفاده می گردد.
– آبجکت با درجه حرارت بالاتر می تواند جایگزین سایر آبجکتهای سردتر ذخیره شده شود و در نتیجه آنها را به طور کامل یا جزئی به دیسک براند.
– آبجکتهای موجود در Big Table Cache که توسط اجسام داغ به دیسک رانده شده اند، هنگامی که دمای آنها افزایش می یابد یا حافظه کافی در دسترس است، به طور خودکار در Cache بارگذاری می شوند.
– وقتی آبجکت را نمی توان به طور ک-امل ذخیره کرد، آن را بصورت جزئی ذخیره می کند.
– در درجه اول به منظور افزایش کارایی workloads انبار داده طراحی شده است، اما همچنین کارایی workloads ترکیبی را نیز بهبود می بخشد.