ข้ามไปเนื้อหาหลัก

เคลียร์ Index ฐานข้อมูลส่วนเกินอย่างไรไม่ให้ประสิทธิภาพพัง

แนวทางการตรวจสอบและลบ Index ที่ไม่ได้ใช้อย่างปลอดภัยใน SQL Server พร้อมวิธีวิเคราะห์ข้อมูลการใช้งานและหลีกเลี่ยงข้อผิดพลาด

เรียบเรียงโดย AI
Inewgen
22 Sep 2026ที่มา: Dev.to2 นาทีอ่าน (0 ครั้ง)
แชร์
เคลียร์ Index ฐานข้อมูลส่วนเกินอย่างไรไม่ให้ประสิทธิภาพพัง

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง

ขนาดตัวอักษร
  • Index ส่วนเกินเพิ่มภาระให้การเขียนข้อมูลและการบำรุงรักษา
  • sys.dm_db_index_usage_stats ช่วยตรวจสอบการใช้งานแต่ต้องระวังเรื่องรีสตาร์ท
  • ควรเก็บข้อมูลสถิติข้ามรอบธุรกิจเช่นรอบเดือนหรือรอบปี
  • Azure SQL รอมากกว่า 90 วันก่อนระบุว่า Index ไม่ได้ใช้งาน

ระบบฐานข้อมูลมักเผชิญปัญหา Index คงค้างจากอดีต เมื่อเกิดคำสั่งค้นหาที่ทำงานช้า วิศวกรจะสร้าง Index ขึ้นมาเพื่อแก้ปัญหาเฉพาะหน้าและปล่อยทิ้งไว้ แม้แอปพลิเคชันจะเปลี่ยนแปลงหรือเลิกใช้ฟีเจอร์นั้นไปแล้วก็ตาม ตารางที่มีการใช้งานสูงจึงสะสม Nonclustered Index จำนวนมากโดยไม่มีใครกล้าลบออก

เครื่องมือหลักในการตรวจสอบคือ sys.dm_db_index_usage_stats ซึ่งช่วยชี้เป้า Index ที่ไม่มีการเรียกใช้งานแต่มีการอัปเดตสอยต่อเนื่อง อย่างไรก็ตาม ตัวเลขเหล่านี้จะถูกรีเซ็ตเมื่อ SQL Server รีสตาร์ท ทำให้ DBA ต้องระมัดระวังในการตัดสินใจลบข้อมูลตามภาพถ่ายสถิติเพียงชั่วคราว

database server rack data center no logo

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง

การมี Index ที่ไม่ได้ใช้ไม่ได้แปลว่าไม่มีต้นทุน เพราะทุกครั้งที่มีการปรับปรุงข้อมูล เซิร์ฟเวอร์ต้องอัปเดตทั้งแถวและ Index ทุกตัวที่เกี่ยวข้อง ยิ่ง Index มีขนาดใหญ่หรือมีรายการ INCLUDE มาก ยิ่งทำให้กิจกรรมใน Log และงานบำรุงรักษาหนักขึ้น

90วันที่ Azure SQL รอพิจารณา Index ว่าไม่ได้ใช้งาน

แนวทางการตรวจสอบที่ปลอดภัยมีขั้นตอนสำคัญดังนี้:

ไม่อยากพลาดข่าวใหม่?

สมัครรับสรุปข่าวสารใหม่ทางอีเมล ไม่บ่อยจนรำคาญ

โฆษณา

  • ตรวจสอบขนาด การใช้งาน และเมทาเดตาของ Index ร่วมกัน
  • ใช้คำสั่ง SQL คัดกรองเฉพาะ Nonclustered Index มาตรฐาน
  • บันทึกผลลัพธ์เก็บไว้ในระบบมอนิเตอร์เพื่อดูพฤติกรรมระยะยาว
  • ครอบคลุมรอบการทำงานสำคัญ เช่น งานสิ้นเดือนหรือการทดสอบกู้คืนระบบ

ตัวอย่างคำสั่งสืบค้นเพื่อรวบรวมข้อมูล Index เบื้องต้น:

WITH index_size AS (SELECT object_id, index_id, SUM(used_page_count) * 8.0 / 1024 AS used_mb FROM sys.dm_db_partition_stats GROUP BY object_id, index_id) SELECT schema_name = s.name, table_name = t.name, index_name = i.name FROM sys.indexes AS i JOIN sys.tables AS t ON t.object_id = i.object_id WHERE i.type = 2;

การบริหารจัดการ Index ในระบบฐานข้อมูลขนาดใหญ่เป็นงานที่ต้องอาศัยความละเอียดอ่อน เนื่องจากระบบการทำงานจริงมักมีรอบการประมวลผลที่ซ่อนอยู่ เช่น รายงานสิ้นปีหรือการตรวจสอบบัญชีประจำไตรมาส การตัดสินใจลบ Index เพียงเพราะสถิติไม่ขยับในช่วงสัปดาห์เดียวอาจทำให้ระบบเกิดอาการคอขวดเมื่อถึงรอบธุรกิจนั้นๆ การเก็บข้อมูลสถิติระยะยาวจึงเป็นหัวใจสำคัญที่สุด

notebook computer office desk workspace

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง

เมื่อได้ข้อมูลครบถ้วนแล้ว ขั้นตอนถัดมาคือการมองหา Index ที่ซ้ำกันอย่างสมบูรณ์แบบ ซึ่งมีคอลัมน์และทิศทางการจัดเรียงเหมือนกันทุกประการ ส่วนกรณีที่ Index มีความทับซ้อนกันจะต้องอาศัยการวิเคราะห์เชิงลึกเพิ่มเติมก่อนตัดสินใจเปลี่ยนแปลง พร้อมทั้งเตรียมสคริปต์ย้อนกลับ (Rollback) ไว้เสมอหากประสิทธิภาพระบบเปลี่ยนไปในทางตรงกันข้าม

ที่มา: Dev.to

ความคิดเห็น

แสดงความคิดเห็น
0/2000

พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้