ว่าด้วยเรื่องของ NOLOGGING กับการใช้งาน

NOLOGGING คืออะไร?

NOLOGGING คือ ออฟชั่นนึงบนตารางที่ช่วยทำให้การ INSERT หรือการสร้างอินเด็กซ์มีความเร็วมากขึ้นกว่าปกติ เป็นเพราะว่ามันจะไม่ทำการเขียน Redo log นั่นเอง แต่ความเร็วที่เพิ่มขึ้นก็ต้องแลกมาด้วยความอันตรายจากการใช้ NOLOGGING นั้น ถ้าในขณะนั้นฐานข้อมูลของคุณเกิดเหตุการณ์ไม่คาดคิดขึ้น แล้วคุณจำเป็นต้องกู้คืนข้อมูลผ่าน Archive log หรือแม้กระทั่ง Redo log ณ ตารางนั้นๆ จะไม่สามารถกู้ข้อมูลกลับมาได้ เพราะฉะนั้นจงใช้มันอย่างระมัดระวังมากที่สุดนะครับ

การที่ NOLOGGING จะสามารถใช้ได้กับการ INSERT ข้อมูลได้หรือไม่ได้นั้น มีเหตุผลหลายประการที่เข้ามาเกี่ยวข้องดังนี้ครับ

1. บนฐานข้อมูลที่ปิดการใช้งาน Archive log
ถ้าบนฐานข้อมูลของคุณไม่ได้ทำการเปิดใช้งาน Archive log และไม่ได้ใช้ APPEND hint สำหรับการ INSERT ข้อมูล ฐานข้อมูลจะยังทำการ Generate redo log นั่นคือ NOLOGGING ไม่มีผลกับกรณีนี้

2. บนฐานข้อมูลที่เปิดการใช้งาน Archive log
ในกรณีคุณจำเป็นต้องทำการเปลี่ยนออฟชั่นบนตารางให้เป็น NOLOGGING ด้วยและคิวรี่ที่ INSERT ข้อมูลต้องใช้ APPEND hint ฐานข้อมูลถึงจะไม่ Generate redo log นอกเหนือจากกรณีนี้ “NOLOGGING จะไม่มีผล”

เพื่อให้เข้าใจภาพมากขึ้น ลองดูข้อมูลจากตารางด้านล่างนี้ครับ

nologging table

ตัวอย่างการใช้งาน NOLOGGING

โดยปกติเราสามารถกำหนดการใช้งาน NOLOGGING สำหรับการ INSERT, การสร้างอินเด็กซ์หรือแม้กระทั่งการ CREATE TABLE AS SELECT (CTAS) ลองดูตัวอย่างข้างล่างนี้ครับ

SQL> alter database archivelog;

Database altered.

SQL> alter database open;

Database altered.

SQL> ALTER TABLE T_TEST1 LOGGING;

Table altered.

SQL> SET TIMING ON
SQL> SET AUTOTRACE TRACEONLY STATISTICS
SQL> INSERT /*+ APPEND */ INTO T_TEST1 SELECT * FROM T_ORI;

1000000 rows created.

Elapsed: 00:00:39.04

Statistics
----------------------------------------------------------
          0  recursive calls
      13578  db block gets
      26606  consistent gets
      10979  physical reads
  109877808  redo size
        816  bytes sent via SQL*Net to client
        742  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
    1000000  rows processed

จากผลด้านบนนั้น ฐานข้อมูลอยู่ในโหมด Archivelog ตารางเปิดใช้งาน LOGGING และมีการใช้ APPEND hint ในการ INSERT ข้อมูลและใช้เวลาไปทั้งหมด 39 วินาทีและพบว่ามีการ Generate redo log ที่นี้เรามาดูตัวอย่างที่ 2 กันครับ

SQL> ALTER TABLE T_TEST1 NOLOGGING;

Table altered.

SQL> INSERT /*+ APPEND */ INTO T_TEST1 SELECT * FROM T_ORI;

1000000 rows created.

Elapsed: 00:00:15.95

Statistics
----------------------------------------------------------
       2912  recursive calls
      15909  db block gets
      27642  consistent gets
      11805  physical reads
     243428  redo size
        804  bytes sent via SQL*Net to client
        742  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          5  sorts (memory)
          0  sorts (disk)
    1000000  rows processed

จากตัวอย่างด้านบนจะเห็นว่า ผมทำการเปิดใช้งาน NOLOGGING ใช้เวลาไปทั้งหมด 16 วินาทีและจะพบว่าไม่มีการ Generate redo log ซึ่งทำให้การ INSERT ข้อมูลเร็วขึ้น

การใช้งาน NOLOGGING ในรูปแบบอื่นๆ นั้นจะมีผลเฉพาะกับ Operation ด้านล่างนี้ครับ

ALTER TABLE … MOVE PARTITION
ALTER TABLE … SPLIT PARTITION
ALTER INDEX … SPLIT PARTITION
ALTER INDEX … REBUILD
ALTER INDEX … REBUILD PARTITION
CREATE TABLE … AS SELECT …
CREATE INDEX …
LOAD DATA BY SQL* LOADER
INSERT /*+ APPEND */ INTO …

สรูป

สุดท้ายนี้การใช้งาน NOLOGGING นั้นก็เสมือนดาบสองคม มีข้อดีก็ต้องมีข้อเสีย ถ้าผู้ใช้งานใช้แบบไม่ระวังก็อาจเกิดความเสียหายหรือข้อผิดพลาดบนระบบฐานข้อมูลได้ครับ เพราะฉะนั้นเราต้องคำนึงถึงผลที่ตามมาก่อนด้วยนะครับถ้าคิดจะใช้งานเจ้าออฟชั่นตัวนี้ แล้วเดี๋ยวในบทความหน้าผมจะมาบอกเล่าเกี่ยวกับ APPEND hint ครับว่ามันคืออะไร? ใช้ยังไง? โทษและประโยชน์คืออะไร? ขอบคุณครับ

ขอบคุณข้อมูลเพิ่มเติมจาก
Oracle nologging tips by Don Burleson

Advertisements

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s