Group Blog
 
<<
กุมภาพันธ์ 2555
 
 1234
567891011
12131415161718
19202122232425
26272829 
 
28 กุมภาพันธ์ 2555
 
All Blogs
 
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_idid ของฐานข้อมูล
object_idid ของตาราง
index_idid ของ 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.

ชื่อ : * blog นี้ comment ได้เฉพาะสมาชิก
Comment :
  *ส่วน comment ไม่สามารถใช้ javascript และ style sheet
 

saknarak
Location :


[ดู Profile ทั้งหมด]

ฝากข้อความหลังไมค์
Rss Feed
Smember
ผู้ติดตามบล็อก : 1 คน [?]




MCT, MCITP:SQLServer, MySQL DBA, DEV, CCSI
Friends' blogs
[Add saknarak's blog to your web]
Links
 

 Pantip.com | PantipMarket.com | Pantown.com | © 2004 BlogGang.com allrights reserved.