[SQL] Index นั้นสำคัญไฉน
การทำ Index หรือ ดรรชนีข้อมูล เพื่อให้สามารถค้นหาข้อมูลบน Table ได้อย่างรวดเร็ว โดยเราสามารถสร้าง index ได้ทั้งจาก column เดียว หรือ หลาย column รวมกัน (degree) ได้ การสร้าง index มักจะสร้างให้กับ table ที่มีขนาดใหญ่ และมีการ Query ข้อมูลบ่อยๆ เพราะฉะนั้นการสร้าง index ให้กับ column ที่มักมีการใช้งานในการกำหนดเงือนไขของข้อมูล (Where clause) ทำให้ระบบสามารถค้นหาข้อมูลได้รวดเร็ว แต่การสร้าง Index นั้นจะมีผลต่อการใช้งานพื้นที่ disk ที่มากขึ้นตามไปด้วย ขึ้นอยู่กับจำนวนข้อมูลภายใน table นั้นๆ
Index แบ่งออกเป็น 2 ประเภทใหญ่ๆ ดังนี้
clustered index คือ index บน column ที่ระบุ physical sequence ของ table หมายถึงว่า table นั้นได้ถูกเรียงไปในทางเดียวกัน ซึ่งข้อมูลจะถูกจัดเรียง (Sorted) และเก็บตามลำดับของอินเด็กซ์ (index order) ตัวอย่างเช่น Table ที่ประกอบด้วย ชื่อและนามสกุล และอื่นๆ ก่อนที่จะสร้าง index ให้แก่ Table ข้อมูลจะถูกจัดเก็บ ตามลำดับของการ insert เข้ามา แต่ถ้าสร้าง index ให้แก่ Table จะทำให้ ข้อมูลทั้งหมดถูกเรียงใหม่ตามลำดับของตัวอักษร
non-clustered index คือ index บน column ที่ไม่ได้ระบุ physical sequence ของ table ซึ่งจะเก็บรักษา index file ที่ประกอบด้วย Pointer ที่ใช้ในการอ้างอิงว่า ข้อมูลอยูที่ใด ใน Table โดยขึ้นอยู่กับว่า Cluster index จัดการกับข้อมูลอย่างไร เมื่อมีการ Query จะมีการใช้ Non-clustered index เพื่ออ่านสองอย่างคือ อ่านหาค่า index จาก index file และ อ่านค่า ข้อมูลจริงจาก Table
เนื่องจาก Non-Clustered index ขึ้นอยู่กับพื้นที่ที่เก็บข้อมูล และ ขึ้นอยู่กับว่า Clustered Index มีการจัดการกับข้อมูลอย่างไร ดังนั้นควรจะกำหนด Clustered Index ก่อน เพราะข้อมูลจะถูกจัดเรียงโดยอัตโนมัติ ทำให้เราไม่ต้องการการอ่านค่าสองครั้งด้วยเหตุดังกล่าวเวลาสร้าง Primary Key จึงนิยมทำเป็น Clustered Index
การสร้าง Index ด้วย SQL Statement ด้วย คำ สั่ง CREATE INDEX
การใช้ Index เพื่อช่วยในการสืบค้น ข้อมูล และ สร้างความเป็นเอกลักษณ์ (Uniqueness) ภายใน Table ดังจะเห็นได้จาก Key ทุกประเภท จะเป็น Index ทั้งสิ้น นอกจากนี้ Indexes ถูกใช้ในการเพิ่มความเร็วในการ select เพราะเหตุว่า Index จะเก็บข้อมูลเกี่ยวกับ Key ต่างๆ และเก็บที่อยู่ของ Key อีกด้วย
รูปแบบ (Format) โดยทั่วไป:
CREATE [UNIQUE][CLUSTERED | NON CLUSTERED] INDEX index_name
ON [[database.]owner.]table_name (column_name[,column_name]…)
[WITH
[ [ , ] IGNORE_DUP_KEY]
[ON segment_name]
กรณีที่ Index ถูกสร้างด้วย Option แบบ UNIQUE SQL Server จะไม่อนุญาตให้ record ที่เป็น index มีค่าซํ้าซ้อน (duplicate) ซึ่งเป็นกฎที่สำคัญในการรักษา Data Integrity ของ Table แต่อย่างไรก็ดีกรณีที่ผู้ออกแบบจำ เป็นต้องมีค่าที่ซํ้ากันของ Index SQL Server ก็อนุญาตให้ทำได้โดยใช ้Option IGNORE_DUP_KEY CLUSTERED ในกรณีของ clustered index คือการทำ special index ที่บังคับให้ SQL Server เก็บข้อมูลไว้ให้ตามลำดับของ index เพื่อให้สามารถ Select ได้อย่างรวดเร็วเพราะเหตุว่า server รู้ว่าข้อมูลของ index นั้น ๆ อยู่ถัดไปจาก index ปัจจุบันนั่นเอง
สรุป
Index ของ Microsoft SQL Server มีประโยชน์ในการทำงานกับการ Query ข้อมูลบน SQL Server เป็นอย่างมาก จะทำให้ทำงานได้รวดเร็วยิ่งขึ้นอย่างมาก แต่หากใช้ไม่เป็นก็อาจจะทำให้เปลือง Disk หรือทำงานได้ช้าเช่นกัน
ศึกษาเพิ่มเติมได้ที่
ศึกษาเพิ่มเติมได้ที่