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, สร้าง, ทดสอบ และบริหารดัชนีโดยอัตโนมัติ
สภาพแวดล้อมการทดสอบ
| รายการ | ค่า |
|---|---|
| Platform | Oracle Autonomous Transaction Processing (ATP) — Free Tier |
| OCI Region | ap-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 ที่ดี



