|
| 1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | |
|
|
|
|
|
|
|
Performance Tuning: Dead Index คืออะไร
ภาระหน้าที่ของผู้ดูแลระบบฐานข้อมูล ส่วนหนึ่งคือการทำให้ระบบมีประสิทธิภาพดีที่สุด ซึ่งหากแก้ปัญหาด้านประสิทธิภาพด้วยการเพิ่มสเปคเครื่อง จะเป็นแก้ปัญหาที่ไม่ยั่งยืน เพราะปัญหายังคงอยู่ แต่หากแก้ที่สาเหตุ อาจจะไม่ต้องอัพเกรดเครื่องได้อีกหลายปีเลยทีเดียว
ในบทความนี้จะพูดถึง Dead Index ว่าคืออะไร มีผลต่อประสิทธิภาพอย่างไร
เป็นที่ทราบกันดีว่า Index มีส่วนช่วยในการคิวรีเป็นอย่างมาก จากเวลาหลายชั่วโมง อาจจะเหลือเพียงไม่กี่สิบนาทีเท่านั้น ผู้ดูแลระบบจึงมีการสร้าง Index เพื่อรองรับการคิวรีในลักษณะต่าง ๆ เป็นจำนวนมาก แต่การสร้าง Index นั้น ควรสร้างเท่าที่จำเป็นเท่านั้น เพราะแม้ว่า Index จะช่วยให้คิวรีได้เร็วขึ้น แต่ก็ต้องมีค่าใช้จ่าย มีภาระในการปรับปรุง Index ให้มีความถูกต้องตลอดเวลา มีผลทำให้กระบวนการแก้ไขข้อมูลเช่น Insert/Update/Delete ช้าลงเป็นอย่างมาก และยิ่งมีการ Index เป็นจำนวนมาก แต่ไม่เคยถูกเรียกใช้เลย นอกจากไม่ช่วยให้คิวรีเร็วขึ้นแล้ว ยังเป็นภาระแก่ระบบอีกด้วย Index ประเภทนี้จึงมีชื่อเรียกว่า Dead Index
โชคดีที่การหาว่า Index ใดเป็น Dead Index สามารถทำได้อย่างง่ายดายใน SQL Server โดยเพียงแค่ดูผลลัพธ์ที่ได้จากวิว sys.dm_db_index_usage_stats เท่านั้น
SELECT * FROM sys.dm_db_index_usage_stats
ผลลัพธ์ที่ได้จากวิวนี้ มีฟิลด์ที่น่าใจคือ
ฟิลด์ | ความหมาย |
---|
database_id | id ของฐานข้อมูล |
---|
object_id | id ของตาราง |
---|
index_id | id ของ index |
---|
user_seeks | จำนวนครั้งที่เกิดการ seek ยิ่งเยอะยิ่งดี |
---|
user_scans | จำนวนครั้งที่เกิดการ scan ยิ่งน้อยยิ่งดี |
---|
user_lookups | จำนวนครั้งที่เกิดการ lookup ยิ่งน้อยยิ่งดี |
---|
user_updates | จำนวนครั้งที่เกิดการ updates ให้ดูเทียบกับการ seek/scan/lookup |
---|
last_user_* | วันเวลาสุดท้ายที่เกิดการกระทำนั้น |
---|
Index ที่ดี ควรมียอดการ seek มาก ๆ และ last_user_seek ต้องเป็นเวลาในปัจจุบันด้วย หาก Index ใดมียอด seek น้อย หรือ last_user_seek เป็นเวลาในอดีต นั่นแสดงว่า Index นั้นสามารถถูก Drop ออกจากระบบ เพราะเข้าข่ายเป็น Dead Index
อย่างไรก็ตามก่อนการพิจารณาว่า Index ใดเป็น Dead Index ควรให้ระบบได้ทำงานเต็มที่ครบวงจรก่อน เพราะอาจมี Index บางอันมีความสำคัญต่อการทำงานมาก แต่ถูกใช้เพียงสัปดาห์ละครั้ง จึงควรพิจารณาให้ดีก่อนทำการ Drop นะครับ
สำหรับคิวรีเพื่อแสดงชื่อตาราง และชื่อ Index ใช้คิวรีนี้ได้เลยครับ
SELECT DB_NAME(dmv.database_id) AS db_name , OBJECT_NAME(dmv.object_id) AS table_name , i.name AS index_name , dmv.* FROM sys.dm_db_index_usage_stats dmv JOIN sys.indexes i ON dmv.object_id=i.object_id AND dmv.index_id=i.index_id
//msdn.microsoft.com/en-us/library/ms188755.aspx
Create Date : 28 กุมภาพันธ์ 2555 |
Last Update : 28 กุมภาพันธ์ 2555 23:33:11 น. |
|
0 comments
|
Counter : 1226 Pageviews. |
|
|
|
| |
|
|