پارامتر commit_wait و log file sync

همانطور که می دانید، قبل از انجام هر commit در بانک اطلاعاتی، باید همه redo informationهای تراکنش مربوطه، با کمک پروسس LGWR، به online redo log منتقل شوند و پس از اتمام عملیات log writer، پیام انجام commit، به کاربر برگردد(Commit complete) این مدت زمان انتظار در اوراکل، به عنوان جزیی از Wait Eventای به نام log file sync شناخته می شود و بدیهی است که در صورت رخ دادن این اتفاق(انتظار برای انجام commit)، طبیعتا log file sync  هم درصد بیشتری از dbtime را به خود اختصاص خواهد داد.

با اگاهی از این مطلب، روشن می شود که با تکرار مکرر فرمان commit در بانک اطلاعاتی، شانس رخ دادن log file sync هم افزایش خواهد یافت اما نمی توان انجام مکرر commit را تنها عامل رخ دادن این انتظار دانست و از دلایل دیگری چون کندی دیسک(دیسکی که redo log در ان قرار دارد)، محدودیت منابع پروسس LGWR و … که از دلایل تشدید کننده این نوع از Wait Event هستند، صرف نظر کرد به عبارت دیگر، ممکن است پروسس LGWR برای انجام وظایفش صرفا برای انجام یک Commit به دلایلی چون سرعت پایین I/O، نیاز به زمان نسبتا زیادی داشته باشد که این اتفاق هم، منجر به افزایش زمان مربوط به log file sync خواهد شد.

توجه! در این متن، صرفا دغدغه کاهش و یا جلوگیری کلی رخ دادن log file sync به دلیل commitهای مکرر را خواهیم داشت و از بررسی عوامل دیگر و همچنین روشهای دیگر جلوگیری و یا کاهش این نوع از انتظار، صرف نظر خواهیم کرد.

برای کاهش تکرار log file sync (مخصوصا در هنگام اجرای commitهای مکرر)، روشی وجود دارد که می توان با کمک ان، این نوع از انتظار را به طور کلی حذف و یا به حداقل رساند(البته با قبول مخاطراتی به جهت از دست دادن اطلاعات).

در این روش، رویه پیش فرض انجام commit، با کمک پارامترها(در هر کدام از سطوح system، session و transaction) تغییر خواهد کرد و پیام commit، قبل از اتمام وظایف محوله به LGWR، به کاربر نشان داده خواهد شد. در ادامه با کمک پارامتر commit_wait به عنوان یکی از پارامترهای اثرگذار در این زمینه، نشان خواهیم داد که چگونه با این تغییر جزیی در شیوه انجام commit، مدت زمان انتظار مدنظر به حداقل خواهد رسید.

مقادیر قابل قبول برای پارامتر commit_wait، به صورت زیر می باشند:

NOWAIT: با این مقدار، قبل از حصول اطمینان از پایان یافتن وظایف محوله پروسس LGWR، پیام Commit به کاربر نمایش داده خواهد شد. البته تنظیم پارامتر commit_wait به این مقدار، در زمان crash کردن دیتابیس، مخاطراتی را به همراه خواهد داشت و ممکن است سبب از دست رفتن اطلاعات شود ولی از طرفی باعث تسریع در انجام عملیات خواهد شد.

WAIT: برخلاف مقدار nowait، در این حالت، پیام Commit complete تنها زمانی به کاربر نشان داده می شود که از انجام کار توسط پروسس LGWR، اطمینان حاصل شود.

FORCE_WAIT: در حالت قبلی(wait)، می توان در سطح یک session و یا تراکنش، مقدار این پارامتر را تغییر داد اما با تنظیم commit_wait به force_wait در سطح سیستم، تنظیم این پارامتر در سطح session و یا تراکنش، بی اثر خواهد شد.

در ادامه با ارائه یک مثال، مقایسه ای را به لحاظ سرعت بین دو مقدار wait و nowait انجام خواهیم داد:

 create table tbl(id number(9),value varchar2(9));

–تنظیم پارامتر commit_wait به مقدار wait:

alter system set commit_wait=’wait’;

set timing on;

begin

 for i in 1..300000 loop

 insert into tbl values (i, ‘wait’);

 commit;

 end loop;

 end;

  /

PL/SQL procedure successfully completed.

Elapsed: 00:04:03.46

با اجرای این بلاک plsqlای، رویداد log file sync را با بیشترین زمان سپری شده، مشاهده خواهیم کرد:

–تنظیم پارامتر commit_wait به مقدار nowait:

truncate table tbl;

alter system set commit_wait=’nowait’;

set timing on;

begin

 for i in 1..300000 loop

 insert into tbl values (i, ‘nowait’);

 commit;

 end loop;

 end;

  /

PL/SQL procedure successfully completed.

Elapsed: 00:00:21.54

همانطور که قابل مشاهده است، زمان اجرای بلاک در دو حالت wait و nowait، تفاوت بسیار فاحشی با هم دارند و همچنین با اجرای این بلاک به صورت nowait، رویداد انتظار log file sync از صدر به زیر کشانده خواهد شد:

نکته: با کمک یکی از دستورات زیر، می توان در سطح یک تراکنش هم در این زمینه اعمال نظر کرد(بدون استفاده از پارامتر commit_wait):

commit write nowait;

commit write wait;

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *