مقدمه
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” انجام شود.