Auto Indexing บน Oracle Autonomous Database: วิเคราะห์กลไกและผลการทดสอบ

ในการบริหารจัดการระบบฐานข้อมูลเชิงสัมพันธ์ขนาดใหญ่ การกำหนดดัชนีที่เหมาะสม (Index Design) ถือเป็นปัจจัยหลักที่ส่งผลต่อประสิทธิภาพการสืบค้นข้อมูล หากคอลัมน์ที่ใช้กรองข้อมูลในเงื่อนไข WHERE ไม่มีดัชนีรองรับ Cost-Based Optimizer (CBO) จะเลือกแผน TABLE ACCESS FULL ส่งผลให้ I/O สูงตามสัดส่วนขนาดของตาราง

Oracle แก้ไขปัญหานี้ด้วยฟีเจอร์ Auto Indexing บน Oracle Autonomous Database ซึ่งรันบน Exadata Cloud Infrastructure โดย AI Engine ของระบบจะทำหน้าที่วิเคราะห์ Workload, สร้าง, ทดสอบ และบริหารดัชนีโดยอัตโนมัติ

สภาพแวดล้อมการทดสอบ

รายการค่า
PlatformOracle Autonomous Transaction Processing (ATP) — Free Tier
OCI Regionap-singapore-1
ตารางTEST_SALES
จำนวนแถว1,000,000
จำนวน Customer ID ที่ไม่ซ้ำกัน10,000
SQL ที่ทดสอบSELECT SUM(sale_amount) FROM TEST_SALES WHERE customer_id = :bind_val

กระบวนการทำงานของ Auto Indexing

Auto Indexing ทำงานผ่านวงจร 5 ขั้นตอน ดังนี้:

1. Identify Candidates — สแกน SQL Workload History เพื่อระบุคอลัมน์ที่เป็น candidate สำหรับการทำดัชนี
2. Create Invisible Indexes — สร้างดัชนีในสถานะ INVISIBLE ชื่อขึ้นต้นด้วย SYS_AI_
3. Verify / Test Run — ทดสอบประสิทธิภาพ SQL แบบ Background เปรียบเทียบ Buffer Gets และ Elapsed Time
4. Implement — เปลี่ยนสถานะดัชนีเป็น VISIBLE หากผ่านเกณฑ์ประสิทธิภาพ
5. Clean Up — ลบดัชนีที่ไม่ถูกใช้งานเกิน 373 วัน (ค่าเริ่มต้น) เพื่อลด DML overhead

ผลการทดสอบ

ดัชนีที่ระบบสร้างขึ้นอัตโนมัติ

หลังจากรัน Workload ซ้ำบนคอลัมน์ CUSTOMER_ID ซึ่งยังไม่มีดัชนีรองรับ ระบบตรวจจับและสร้างดัชนีชื่อ SYS_AI_cr24sdqwm1kwp โดยอัตโนมัติ:

  • ประเภท: B-TREE
  • ตาราง: TEST_SALES
  • คอลัมน์: CUSTOMER_ID
  • สถานะ Visibility: VISIBLE
  • สถานะ Validation: VALID

ตัวชี้วัดก่อน-หลัง (ต่อคิวรี)

ตัวชี้วัด ก่อน (Full Table Scan) หลัง (Auto Index) การเปลี่ยนแปลง
Elapsed Time (วินาที) ~0.82 <0.002 ลดลง ~99.8%
Buffer Gets 23,027,581 123 ลดลง 99.999%
CPU Time (วินาที) 58.7 2.2 ลดลง ~96%
Optimizer Cost 1,483 102 ลดลง ~93%

การเปลี่ยนแปลงของ Execution Plan

การเปลี่ยนแปลงของ Buffer Gets จาก 23,027,581 เป็น 123 เป็นผลโดยตรงจากการที่ CBO เปลี่ยน Operation จาก TABLE ACCESS FULL ไปเป็น INDEX RANGE SCAN บนดัชนี SYS_AI_cr24sdqwm1kwp

แทนที่จะอ่านทุก Data Block ในตาราง (~23 ล้าน Logical Read) Optimizer อ่านเฉพาะ Index Entry ที่ตรงกับค่า CUSTOMER_ID แล้วเข้าถึง Row แบบ ROWID โดยตรง ซึ่งกิน Logical Read เพียง 3 (Index) + 120 (Table Rows) = 123 ครั้ง

ข้อควรพิจารณา

  • Auto Indexing เหมาะกับ Workload ที่มี Pattern การสืบค้นซ้ำและคงที่ สำหรับ Workload ที่แปรผันบ่อย ผลลัพธ์อาจแตกต่างกัน
  • ดัชนีที่ระบบสร้างขึ้น (SYS_AI_) ไม่สามารถแก้ไขหรือ Rebuild ด้วยตนเองโดยตรง ต้องใช้ DBMS_AUTO_INDEX หากต้องการปรับค่าพฤติกรรม
  • การทดสอบนี้ใช้ตาราง TEST_SALES ที่สร้างขึ้นสำหรับวัตถุประสงค์นี้โดยเฉพาะ ค่าตัวเลขอาจแตกต่างไปตามโครงสร้างข้อมูลจริงในระบบงาน
  • Buffer Gets ในระดับ 23 ล้านบนตาราง 1 ล้านแถว ชี้ให้เห็นว่ามีการเรียกบล็อกซ้ำ (Multi-block Read หลายรอบ) ซึ่งเป็นลักษณะที่พบเมื่อไม่มี Cluster Factor ที่ดี