مقدمه
Scalable sequences بمنظور کاهش مشکلات hot index block ، در حین وجود بار اطلاعات در مقیاس بالا در جداول بههمراه sequenceهای تولید شده primary keyها در دیتابیسهای single instance و RAC.
Scalable sequences از زمان عرضه اولین نسخه Oracle 12C در دسترس بوده است، اما بدرستی مستند نشده بودند. view مربوطه %_SEQUENCS شامل ستونهای SCALE_FLAG , EXTEND_FLAG میباشد اما ساختار استفاده از scalable sequences تا قبل از 18C مستند نشده بودند، بنابراین از آن پشتیبانی انجام نمیشده.
Scalable Sequences in Oracle Database 18c
The Problem:
Sequence یک آبجکت در سطح دیتابیس بمنظور تولید اعداد منحصربفرد میباشد، که معمولاً برای ایجاد یک ستون primary key ساختگی در یک جدول استفاده میشود. از آنجا که شمارههای sequence همیشه درحال رشد هستند (معمولا با شمارش 1) ، هر ورودی جدید در راستترین بلاک هر index قرار میگیرد که آنرا به یک hot block تبدیل میکند. این موضوع بهتنهایی میتواند باعث اختلال شود و درمورد ساختار rac میتواند بدتر باشد.
از آنجا که oracle 8 ممکن است از reverse key indexes برای حل این مشکل استفاده کرده باشد، اما scalable sequence ممکن است راه حل بهتری باشد.
Creating Scalable Sequences:
scalable sequence یک پسوند ۶ رقمی به sequence اضافه میکند. پسوندها از ترکیب ۳ رقم instance offset و ۳ رقم session offset ایجاد شدهاند. مستندات آن بشرح زیر میباشند:
[(instance id % 100) + 100] || [session id % 1000]
شماره sequence دارای قالب نهایی “prefix || zero-padding || sequence” میباشد. مقدار padding بستگی به تعریف sequence دارد.
با معرفی scalable sequence ، مقدار پیشفرض sequence برابر با NOSCALE میباشد، ولی میتوانید برای آن مقدار مشخص کنید. عملکرد آن مشابه sequence عادی میباشد:
column scale_seq format 99999999999999999
drop sequence my_scale_seq;
create sequence my_scale_seq
minvalue 1
maxvalue 9999999999
noscale;
SQL> select my_scale_seq.nextval as scale_seq from dual;
SCALE_SEQ
1
SQL> select my_scale_seq.nextval as scale_seq from dual;
SCALE_SEQ
2
SQL>
تنظیم ویژگی SCALE ، که معادل استفاده از SCALE NOEXTEND است، باعث میشود یک پیشوند ۶ رقمی به sequence اضافه شود و با استفاده از padding میتواند حداکثر تعداد رقم را بر اساس مقدار MAXVALUE استفاده کند. در مثال زیر مقدار pad صفر است تا طول sequence تعداد ۱۰ رقم باشد:
drop sequence my_scale_seq;
create sequence my_scale_seq
minvalue 1
maxvalue 9999999999
scale;
SQL> select my_scale_seq.nextval as scale_seq from dual;
SCALE_SEQ
1012800001
SQL> select my_scale_seq.nextval as scale_seq from dual;
SCALE_SEQ
1012800002
SQL>
اضافه کردن عبارت EXTEND باعث میشود با اضافه شدن عدد صفر یه طول شماره sequence به حداکثر مقدار برسد. با به هم پیوسته شدن پیشوندها، طول نهایی شماره sequence به مقدار ۶ رقم بیشتر از مقدار پیشنهادی در تنظیمات MAXVALUE میباشد:
drop sequence my_scale_seq;
create sequence my_scale_seq
minvalue 1
maxvalue 9999999999
scale extend;
SQL> select my_scale_seq.nextval as scale_seq from dual;
SCALE_SEQ
1012800000000001
SQL> select my_scale_seq.nextval as scale_seq from dual;
SCALE_SEQ
1012800000000002
SQL>
در اینجا میتوانیم تاثیر اتصال یک سیشن جدید را برروی پیشوند مشاهده کنیم:
SQL> conn test/test@pdb1
Connected.
SQL> select my_scale_seq.nextval as scale_seq from dual;
SCALE_SEQ
1010200000000003
SQL> CONN test/test@pdb1
Connected.
SQL> select my_scale_seq.nextval as scale_seq from dual;
SCALE_SEQ
1012760000000004
SQL>
Altering Scalable Sequences:
میتوان scale و extend یک sequence موجود را از طریق روش زیر تغییر داد:
alter sequence my_scale_seq noscale;
alter sequence my_scale_seq scale noextend;
alter sequence my_scale_seq scale extend;
Views:
به view زیر ستونهایSCALE_FLAG و EXTEND_FLAG اضافه شده است:
column sequence_name format a30
column scale_flag format a10
column extend_flag format a11
select sequence_name,
scale_flag,
extend_flag
from user_sequences
where sequence_name = ‘MY_SCALE_SEQ’;
SEQUENCE_NAME SCALE_FLAG EXTEND_FLAG
MY_SCALE_SEQ Y Y
SQL>
Implications:
استفاده از scalable sequence شامل پیامدهای زیر میشود:
• تمامی اعداد sequence از نظر تعداد ارقام در اندازه کامل هستند. اگر برنامه شما شماره sequence را نمایش میدهد ممکن در قالببندی آن مشکل داشته باشید.
• زمانی که از NOEXTEND استفاده میکنیم، بدلیل حذف مقدار پیشوند ۶ رقم از حداکثر مقدار sequence کاهش مییابد.
• زمانی که از EXTEND استفاده میکنید، باید تنظیمات سایز برای متغییرها و ستونها بمنظور پشتیبانی از “LENGTH(MAXVALUE)+6” انجام شود.