Append Hint چگونه بر کیفیت اجرا و عملکرد پایگاه داده اوراکل تاثیر میگذارد؟
Append Hint چگونه بر کیفیت اجرا و عملکرد پایگاه داده اوراکل تاثیر میگذارد؟
Append Hint به بهینه سازی میگویند که یک درج مستقیم را انجام دهد و به چند دلیل باعث بهبود عملکرد عملیات (INSERT .. SELECT) میشود:
• دادهها (Data) به انتهای جدول پیوست میشوند، به جای آنکه سعی کنند از فضای آزاد موجود در جدول استفاده کنند.
• دادهها به صورت مستقیم توسط buffer cache داخل پوشه های دادهها نوشته می شوند.
• محدودیت در یکپارچگی ارجاعی در نظر گرفته نشده است.
• هیچ trigger اجرا نشده است.
ترکیب این ویژگی ها باعث می شود که درج مستقیم به طور قابل توجهی از درج معمولی سریع تر باشد. این دو نکته می توانستند منطقاً دیتا را خراب کنند بنابراین اراکل Append Hint را نادیده می گیرد و دیتا توسط مسیر معمولی بارگذاری می شود اگر بحث محدودیت یکپارچگی ارجاعی و راه اندازی، بر روی میز باشند.
چگونه Append Hint بر روی اندازه جدول تاثیر می گذارد؟ (High Watermark)
همانطور که درج های مسیر مستقیم دیتا را به انتهای جدول اضافه می کنند، آن ها به طور مداوم high watermark جدول را افزایش می دهند حتی اگر فضای خالی زیادی در جدول وجود داشته باشد. در جداولی که معمولاً ردیف ها به طور منظم حذف شده اند، استفاده از Append Hint می تواند در جداول بزرگ حاوی تعداد زیادی بلوک های کم جمعیت، نتیجه بدهد. لازم است تا این موضوع توسط یکی از انواع عملیات های کوچک کردن (shrink operation) زیر، اداره شود.
• export کردن دیتا، کوتاه کردن جدول و import کردن دیتا
• از عملیات (CTAS) “Create Table … As Select” استفاده کنید تا یک جدول جدید به همراه دیتا فشرده بسازید، جدول اصلی را drop کنید و نام جدول جدید را تغییر دهید تا آن را با جدول اصلی جایگزین کنید.
• از عملیات تعریف دستورات جدول آنلاین برای بازسازی استفاده کنید.
• از یک بخش عملیات online segment shrink برای فشرده سازی دیتا استفاده کنید.
چگونه Append Hint بر روی Redo Generation تاثیر میگذارد؟
اگر پایگاه داده اوراکل روی حالت No Archive Log اجرا می شود، فقط از Append Hint استفاده کردن باعث کاهش Redo Generation می شود. در واقع، شما به ندرت پایگاهداده های OLTP را در حالت No Archive Log اجرا می کنید پس چه اتفاقی در حالت No Archive Log می افتد؟ در حالت No Archive Log استفاده از Append Hint باعث کاهش Redo Generation نمی شود مگر اینکه جدول بر روی No Logging تنظیم شده باشد. مثال های زیر این فرآیند را به صورت گام به گام و عملی نشان می دهند.
مثال زیر در برابر یک پایگاهداده در حالت No Archive Log اجرا شده است. Redo Generation، (پر رنگ) نشان داده شده است.
SQL> CREATE TABLE t1 AS SELECT * FROM all_objects WHERE 1=2;
Table created.
SQL> SET AUTOTRACE ON STATISTICS
SQL> INSERT INTO t1 SELECT * FROM all_objects;
۷۲۵۱۲ rows created.
Statistics
———————————————————-
۶۳۴ recursive calls
۹۹۴۶ db block gets
۵۰۱۱۶ consistent gets
۲ physical reads
۸۴۶۴۵۲۰ redo size
۸۳۰ bytes sent via SQL*Net to client
۷۹۶ bytes received via SQL*Net from client
۳ SQL*Net roundtrips to/from client
۱۵۰۸ sorts (memory)
۰ sorts (disk)
۷۲۵۱۲ rows processed
SQL> TRUNCATE TABLE t1;
Table truncated.
SQL> INSERT /*+ APPEND */ INTO t1 SELECT * FROM all_objects;
۷۲۵۱۲ rows created.
Statistics
———————————————————-
۳۶۹ recursive calls
۱۶۸۹ db block gets
۴۸۱۹۴ consistent gets
۲ physical reads
۴۶۰۴۸ redo size
۸۲۲ bytes sent via SQL*Net to client
۸۱۰ bytes received via SQL*Net from client
۳ SQL*Net roundtrips to/from client
۱۵۰۰ sorts (memory)
۰ sorts (disk)
۷۲۵۱۲ rows processed
SQL> COMMIT;
Commit complete.
SQL>
همانطور که نشان داده شده است، با پایگاهداده در حال اجرا در حالت No Archive Log، اضافه شدن Append Hint، مقدار Redo Generation را کاهش داده است.
مثال بعدی تست مشابهی را اجرا می کند اما این بار با پایگاهدادهی که در حالت Archive Log اجرا می شود.
SQL> CREATE TABLE t1 AS SELECT * FROM all_objects WHERE 1=2;
Table created.
SQL> SET AUTOTRACE ON STATISTICS
SQL> INSERT INTO t1 SELECT * FROM all_objects;
۸۸۷۷۳ rows created.
Statistics
———————————————————-
۶۱۳ recursive calls
۱۱۷۹۲ db block gets
۱۱۶۸۰۸ consistent gets
۲ physical reads
۱۰۲۲۲۳۵۲ redo size
۳۷۰ bytes sent via SQL*Net to client
۵۵۲ bytes received via SQL*Net from client
۳ SQL*Net roundtrips to/from client
۳۱۴۲ sorts (memory)
۰ sorts (disk)
۸۸۷۷۳ rows processed
SQL> TRUNCATE TABLE t1;
Table truncated.
SQL> INSERT /*+ APPEND */ INTO t1 SELECT * FROM all_objects;
۸۸۷۷۳ rows created.
Statistics
———————————————————-
۳۰۷ recursive calls
۱۵۷۳ db block gets
۱۱۴۴۸۶ consistent gets
۰ physical reads
۱۰۲۲۲۸۶۴ redo size
۳۶۶ bytes sent via SQL*Net to client
۵۶۶ bytes received via SQL*Net from client
۳ SQL*Net roundtrips to/from client
۳۱۳۸ sorts (memory)
۰ sorts (disk)
۸۸۷۷۳ rows processed
SQL> COMMIT;
Commit complete.
SQL>
توجه کنید که چطور اضافه کردن Append Hint دیگر تاثیری بر اندازه Redo Generation ندارد.
برای اجازه دادن به Append Hint برای تاثیرگذاری بر روی Redo Generation ما باید جدول را روی حالت No Loggingتنظیم کنیم.
SQL> ALTER TABLE t1 NOLOGGING;
Table altered.
SQL> TRUNCATE TABLE t1;
Table truncated.
SQL> SET AUTOTRACE ON STATISTICS
SQL> INSERT INTO t1 SELECT * FROM all_objects;
۸۸۷۷۳ rows created.
Statistics
———————————————————-
۵۰۶ recursive calls
۱۱۷۹۰ db block gets
۱۱۶۶۵۲ consistent gets
۰ physical reads
۱۰۲۲۲۳۲۸ redo size
۳۷۳ bytes sent via SQL*Net to client
۵۵۲ bytes received via SQL*Net from client
۳ SQL*Net roundtrips to/from client
۳۱۳۹ sorts (memory)
۰ sorts (disk)
۸۸۷۷۳ rows processed
SQL> TRUNCATE TABLE t1;
Table truncated.
SQL> INSERT /*+ APPEND */ INTO t1 SELECT * FROM all_objects;
۸۸۷۷۳ rows created.
Statistics
———————————————————-
۳۰۷ recursive calls
۱۵۷۳ db block gets
۱۱۴۴۸۶ consistent gets
۰ physical reads
۲۵۹۶۸ redo size
۳۶۶ bytes sent via SQL*Net to client
۵۶۶ bytes received via SQL*Net from client
۳ SQL*Net roundtrips to/from client
۳۱۳۸ sorts (memory)
۰ sorts (disk)
۸۸۷۷۳ rows processed
SQL> COMMIT;
Commit complete.
SQL> DROP TABLE t1 PURGE;
Table dropped.
SQL>
ما می توانیم مشاهده کنیم که با تغییر دادن جدول به No Logging، باعث بازگشت وضع می شویم.
بنابراین جزء در مورد پایگاهداده در حالت No Archive Log و Append hint تنها Redo Generation را کاهش می دهد، اگر جدول (فضا) بر No Logging تنظیم شده باشد.
دیدگاه خود را ثبت کنید
تمایل دارید در گفتگوها شرکت کنید؟در گفتگو ها شرکت کنید.