GLOBAL TEMPORARY TABLE در دیتابیس اوراکل

گاهی اوقات در اجرای دستورات پیچیده SQL نیاز به نگه داری موقت اطلاعات برای محاسبه نتایج نهایی می باشد که می توان در این مواقع از جدول های TEMPORARY در دیتابیس اوراکل کمک گرفت. استفاده از این جدول ها می تواند سبب افزایش سرعت اجرای دستورات SQL شود. این جداول با نام مخفف GTT(GLOBAL TEMPORARY TABLE) شناخته می شوند.

زمانی که یک GTT ساخته می شود اطلاعات ساختاری جدول در دیتابیس به صورت دائمی ذخیره می شود ولی اطلاعات درونی جدول فقط در طول زمان برقراری یک SESSION و یا تا قبل از خاتمه یک تراکنش نگه داری می شود(در حافظه و یا temporary tablespaceها).

در GTT ساختار جدول در هر زمان توسط تمام SESSIONها قابل دسترسی است ولی هر SESSION فقط رکوردهای متعلق به خودش در این جدول را می بیند.

نکنه: اوراکل نگارش 18cه، PRIVATE TEMPORARY TABLE را معرفی کرده است که در این دسته از جدول ها ساختار جدول نیز موقتی است و در انتهای SESSION یا تراکنش DROP می شود. یعنی هر PRIVATE TEMPORARY TABLE فقط برای همان SESSION که آن را ایجاد کرده قابل رویت است.

نکته: از آنجایی که برای محتویات GTT هیچ اطلاعات REDO به صورت مستقیم تولید نمی شود استفاده از GTT برای اطلاعات از نوع temp، می تواند سبب بهبود کارایی دیتابیس شود.

سینتکس ساخت GLOBAL TEMPORARY TABLE را در ادامه می بینید.

CREATE GLOBAL TEMPORARY TABLE table_name (

    column_definition,

    …,

    table_constraints

) ON COMMIT [DELETE ROWS | PRESERVE ROWS];

 

این سینتکس مشابه دستور ساخت جدول معمولی است با این تفاوت که عبارت ON COMMIT در انتهای آن استفاده می شود. عبارت ON COMMIT تعیین می کند که اطلاعات جدول از نوع وابسته به SESSION باشد یا از نوع وابسته به تراکنش.

ON COMMIT DELETE ROWS: به این معنی می باشد که دیتای جدول از نوع وابسته به تراکنش است. یعنی بعد از هر عمل COMMIT، دیتابیس اوراکل آن جدول را TRUNCATE می کند(در سطح session تمام رکوردها را پاک می کند)

ON COMMIT PRESERVE ROWS: در این نوع از GGTها زمانی که یک SESSION خاتمه می یابد اطلاعات جدول حذف می شود (زمانی که COMMIT رخ می دهد اطلاعات حذف نمی شوند). بنابراین این نوع جدول وابسته به SESSION است.

نکته: به صورت پیش فرض دیتابیس اوراکل از ON COMMIT DELETE ROWS استفاده می کند.

مثال: یک GTT به نام tbl1 ایجاد کنید.

CREATE GLOBAL TEMPORARY TABLE tbl1(

    id INT,

    description VARCHAR2(100)

) ON COMMIT DELETE ROWS;

یک عمل INSERT در این جدول انجام دهید و محتویات جدول را نمایش دهید.

INSERT INTO tbl1(id,description)

VALUES(1,’Transaction specific global temp table’);

select * from tbl1;

عمل COMMIT را انجام دهید و محتویات جدول را نمایش دهید.

commit

SELECT id, description FROM tbl1;

همانطور که مشخص است هیچ سطری در جدول وجود ندارد زیرا این جدول از نوع وابسته به تراکنش بوده است و بعد از عمل COMMIT تمام رکوردها حذف شده اند.

مثال: یک GTT وابسته به SESSION می سازیم و مراحل بالا را تکرار می کنیم.

CREATE GLOBAL TEMPORARY TABLE tbl2(

    id INT,

    description VARCHAR2(100)

) ON COMMIT PRESERVE ROWS;

INSERT INTO tbl2(id,description)

VALUES(1,’Session specific global temp table’);

COMMIT;

SELECT id, description  FROM tbl2;

حال از این SESSION خارج می شویم و با یک SESSION جدید وارد می شویم و مجددا اطلاعات جدول را نمایش می دهیم.

SELECT id, description FROM tbl2;

همانطور که مشخص است در SESSION جدید هیچ دیتایی برای نمایش وجود ندارد.

نکته: اوراکل اجازه می دهد برای ستون های جدول GTT از INDEX استفاده کنیم. اگرچه آن INDEX در محدوده اطلاعات GTT برای آن SESSION ایجاد می شود..

نکته: به صورت پیش فرض دیتابیس اوراکل اطلاعات GTT را در DEFAULT TEMPORARY TABLE ذخیره می کند. البته می توان در دستور ساخت، TABLESPACE مورد نظر را مشخص کنیم.

CREATE GLOBAL TEMPORARY TABLE table_name (

    column_definition,

    …,

    table_constraints

) ON COMMIT [DELETE ROWS | PRESERVE ROWS]

TABLESPACE tablespace_name;

 

نکته: اگر یک یا چند SESSION دیگر در حال استفاده GTT باشند نمی توان عملیات DDL (بجز TRUNCATE) روی آن GTT انجام داد.

مثال: یک جدول از نوع وابسته به تراکنش بسازید و در آن INSERT کنید.

CREATE GLOBAL TEMPORARY TABLE tbl3(

    id INT

) ON COMMIT DELETE ROWS;

INSERT INTO tbl3(id) VALUES(1);

حال با یک SESSION دیگر به دیتابیس متصل شوید و دستور ALTER را اجرا کنید.

ALTER TABLE tbl3

ADD description VARCHAR2(100);

حال در SESSION قبلی دستور COMMIT را اجرا کنید تا اطلاعات آن SESSION در GTT حذف شود و دوباره دستور ALTER را اجرا کنید.

بنابراین دستور ALTER بدون خطا اجرا خواهد شد.

نکته: اگر از دستور ROLLBACK استفاده کنیم تمام اطلاعاتی که تاکنون توسط آن SESSION در یک GTT از نوع وابسته به تراکنش ثبت شده است از بین می رود.

نکته: نمی توان از جدول های GTT بکاپ تهیه کرد و یا آنها را ریکاور نمود. بنابراین اگر سیستم دچار خرابی شود تمام اطلاعات این نوع جدول ها از بین می روند.

نکته: اگر چه اطلاعات یک GTT در TEMPORARY TABLESPACE ذخیره می شود  و به صورت مستقیم از آنها REDO تولید نمی شود ولی همچنان اطلاعات UNDO مربوط به GTT در UNDO TABLESPACE ذخیره می شود (تغییر اطلاعات UNDO در فایل های REDO ذخیره می شوند). بنابراین یک GTT از این لحاظ با جدول معمولی تفاوتی ندارد.

نکته: در اوراکل نگارش 12 می توان اطلاعات UNDO یک جدول GTT را درTEMPORARY TABLESPACE ذخیره کرد. بنابراین در این حالت  با استفاده از GTT ذخیره اطلاعات UNDO و REDO در دیتابیس اوراکل کاهش می یابد. یعنی در اوراکل نگارش 12 می توان عملیات تولید REDO از یک جدول GTT را حذف نمود ولی در نگارش های قبل این عملیات کاهش می یابد اما حذف نمی شوند زیرا همچنان اطلاعات UNDO تولید می شود.

نکته: اگر از دستور TRUNCATE در یک SESSION برای یک GTT استفاده شود فقط اطلاعات مربوط به آن SESSION حذف می شود.

نکته: می توان برای یک GTT یک VIEW ساخت و یا یک VIEW برای ترکیبی از جدولهای معمولی و GTT ساخت.

  • نکته: می توان برای TRIGGER GGT تعریف نمود.

Comment (1)

پاسخ دادن به آرش لغو پاسخ

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