วิธีตรวจสอบว่าจำเป็นต้องใช้ดัชนีหรือไม่


110

ฉันใช้เครื่องมือดัชนีอัตโนมัติบนฐานข้อมูล MS SQL ของเรา (ฉันแก้ไขสคริปต์ที่มาจาก Microsoft ซึ่งดูที่ตารางสถิติดัชนี - ดัชนีอัตโนมัติแบบดัชนี ) จากสถิติตอนนี้ฉันมีรายการคำแนะนำสำหรับดัชนีที่ต้องการสร้าง

แก้ไข: ดัชนีที่อธิบายข้างต้นนำข้อมูลจาก DMV ที่บอกให้คุณทราบว่าโปรแกรมฐานข้อมูลจะใช้อะไรสำหรับดัชนีหากมีอยู่และสคริปต์ใช้คำแนะนำ Top x (ตามการค้นหาผู้ใช้ส่งผลกระทบ ฯลฯ ) และวางลงในตาราง

(แก้ไขด้านบนบางส่วนมาจากคำตอบของ Larry Coleman ด้านล่างเพื่อชี้แจงสิ่งที่สคริปต์กำลังทำอยู่)

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

ฉันจำเป็นต้องเรียกใช้ SQL Profiler หรือไม่ควรตรวจสอบรหัสที่สืบค้นตารางหรือไม่ และคุณมีคำแนะนำอื่น ๆ อีกไหม?


1
ลองดูที่บทความsqlserverperformance.wordpress.com/2007/11/29/
Igor Borisenko

ตรวจสอบดัชนีที่ใช้ไม่ได้ บทความอาจช่วยคุณได้: sqlshack.com/ …
Shiwangini Shishulkar

คำตอบ:


80

ผมใช้เจสัน Strate ของสคริปต์การวิเคราะห์ดัชนี (ที่ตั้งเก่า) พวกเขาบอกคุณว่ามีการใช้ดัชนีที่มีอยู่เท่าไหร่และดัชนีที่ขาดหายไปนั้นจะถูกใช้ไปเท่าใด ฉันมักจะไม่เพิ่มดัชนีเว้นแต่ว่าพวกเขาจะทำแบบสอบถามมากกว่า 5 หรือ 10% ของตาราง

สิ่งที่สำคัญที่สุดคือการทำให้แน่ใจว่าแอปพลิเคชันตอบสนองเร็วพอสำหรับผู้ใช้

อัปเดต: บทความบล็อกการวิเคราะห์ดัชนีของ Jason Strate สำหรับสคริปต์ที่ใหม่กว่า (ตำแหน่งใหม่)

การอัปเดตซ้ำ:วันนี้ฉันใช้sp_BlitzIndex®เมื่อทำการวิเคราะห์ดัชนี


เราต้องทำการเปลี่ยนแปลงอะไรในการวิเคราะห์ตารางทั้งหมด
MonsterMMORPG

1
sp_BlitzIndex จะดูตารางทั้งหมดที่มีขนาดที่แน่นอน คุณต้องไปดูเอกสารประกอบเพื่อดูวิธีการปรับแต่ง
Jeremiah Peschka

พารามิเตอร์สำหรับการดำเนินการ sp_BlitzIndex อยู่ที่นี่: brentozar.com/blitzindex
JackArbiter

มีการอัพเดทสามเท่าไหม?
Simon_Weaver

49

มีแนวคิดและคำศัพท์บางอย่างที่สำคัญที่ต้องเข้าใจเมื่อจัดการกับดัชนี การค้นหาสแกนและการค้นหาเป็นวิธีการบางอย่างที่จะใช้ดัชนีผ่านคำสั่งที่เลือก หัวกะทิของคอลัมน์หลักนั้นเป็นส่วนประกอบสำคัญในการพิจารณาว่าดัชนีนั้นมีประสิทธิภาพเพียงใด

การค้นหาเกิดขึ้นเมื่อ SQL Server Query Optimizer พิจารณาว่าวิธีที่ดีที่สุดในการค้นหาข้อมูลที่คุณร้องขอคือการสแกนช่วงภายในดัชนี โดยทั่วไปการค้นหาจะเกิดขึ้นเมื่อเคียวรีถูก "ครอบคลุม" โดยดัชนีซึ่งหมายความว่าเพรดิเคตการค้นหาจะอยู่ในคีย์ดัชนีและคอลัมน์ที่แสดงอยู่ในคีย์หรือที่รวมอยู่ การสแกนเกิดขึ้นเมื่อ SQL Server Query Optimizer พิจารณาว่าวิธีที่ดีที่สุดในการค้นหาข้อมูลคือการสแกนดัชนีทั้งหมดแล้วกรองผลลัพธ์ โดยทั่วไปการค้นหาจะเกิดขึ้นเมื่อดัชนีไม่รวมคอลัมน์ที่ร้องขอทั้งหมดไม่ว่าจะเป็นในคีย์ดัชนีหรือในคอลัมน์ที่รวมไว้ เครื่องมือเพิ่มประสิทธิภาพคิวรีจะใช้คีย์คลัสเตอร์ (เทียบกับดัชนีคลัสเตอร์) หรือ RID (เทียบกับฮีป) เพื่อ "ค้นหา" คอลัมน์ที่ร้องขออื่น ๆ

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

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

เพื่อกำหนดว่าดัชนีมีประสิทธิภาพอย่างไรคุณต้องพิจารณาการเลือกของคีย์ดัชนีของคุณ หัวกะทิสามารถกำหนดเป็นเปอร์เซ็นต์ของการบันทึกที่แตกต่างกันไปสู่บันทึกทั้งหมด ถ้าฉันมีตาราง [person] ที่มีบันทึกรวม 100 รายการและคอลัมน์ [first_name] มีค่าที่แตกต่างกัน 90 ค่าเราสามารถพูดได้ว่าคอลัมน์ [first_name] นั้นเป็นรายการที่เลือก 90% ยิ่งเลือกมากขึ้นเท่าไหร่ก็ยิ่งมีดัชนีสำคัญมากขึ้นเท่านั้น โปรดคำนึงถึงหัวกะทิที่ดีที่สุดคือให้วางคอลัมน์ที่เลือกมากที่สุดในคีย์ดัชนีของคุณ ใช้ตัวอย่าง [คน] ก่อนหน้าของฉันจะเป็นอย่างไรถ้าเรามีคอลัมน์ [last_name] ที่เลือกได้ 95% เราต้องการสร้างดัชนีโดยใช้ [last_name], [first_name] เป็นคีย์ดัชนี

ฉันรู้ว่านี่เป็นคำตอบที่ยืดยาว แต่มีหลายสิ่งหลายอย่างที่เข้าสู่การพิจารณาว่าดัชนีจะมีประสิทธิภาพอย่างไรและมีหลายสิ่งที่คุณต้องชั่งน้ำหนักประสิทธิภาพที่ได้รับเทียบกับ


1
ฉันแค่ต้องการเน้นสิ่งที่กล่าวข้างต้น: ดัชนีชะลอการแทรก / ลบและการปรับปรุงของคุณ หากคุณต้องพูดว่าใส่ข้อมูลจำนวนมากเป็นจำนวนมากคุณจะดีขึ้นโดยไม่ใช้ดัชนี (คุณสามารถสร้างได้หลังจากนั้นมันเร็วกว่า)
Nicolas de Fontenay

มันจะถูกต้องหรือไม่ที่จะพูดถึงว่าดัชนีในคอลัมน์ [last_name], [first_name] สามารถใช้งานได้หากแบบสอบถามจะกรอง last_name และ first_name หรือไม่ ในกรณีที่กรองเฉพาะชื่อแรกไม่สามารถใช้ดัชนีได้หรือไม่
Magier

คำตอบที่ดี - หัวกะทิสำคัญกว่าความสำคัญเชิงหัวใจเมื่อตัดสินใจว่าจะจัดทำดัชนีหรือไม่
วิศวกรที่กลับรายการ

27

ฉันเพิ่งค้นพบสคริปต์ฟรียอดเยี่ยมจากผู้คนที่ BrentOzar Unltd http://www.brentozar.com/blitzindex/

นี่เป็นการวิเคราะห์ที่ดีว่ามีดัชนีใดบ้างใช้บ่อยแค่ไหนและมีการใช้เครื่องมือเคียวรีเพื่อค้นหาดัชนีที่ไม่มีอยู่บ่อยแค่ไหน

มันเป็นแนวทางที่ดี บางครั้งมันก็มีแนวคิดที่เป็นนัยมากกว่า ฉันทำสิ่งต่อไปนี้โดยทั่วไปแล้ว:

  • ลบดัชนีที่ไม่เคยอ่าน (หรืออาจน้อยกว่า 50 ครั้งต่อเดือน)
  • เพิ่มดัชนีที่ชัดเจนที่สุดในคีย์และฟิลด์ต่างประเทศที่ฉันรู้ว่าเราใช้บ่อย

ฉันไม่ได้เพิ่มดัชนีที่แนะนำทั้งหมดและกลับไปอีกหนึ่งสัปดาห์ต่อมาเพื่อพบว่าพวกเขาไม่ได้รับการแนะนำอีกต่อไปเนื่องจากเครื่องมือค้นหาใช้ดัชนีใหม่อื่น ๆ แทน!

โดยทั่วไปคุณควรหลีกเลี่ยงการจัดทำดัชนีใน:

  • ตารางเล็กมาก (น้อยกว่า 50 ถึง 200 รายการ): บ่อยครั้งที่เครื่องมือค้นหาจะเร็วกว่าหากสแกนตารางแทนที่จะโหลดดัชนีอ่านประมวลผลและอื่น ๆ
  • หลีกเลี่ยงการจัดทำดัชนีในคอลัมน์ที่มี Cardinality ต่ำ ( http://en.wikipedia.org/wiki/Cardinality_(SQL_statements) ) ในคอลัมน์แรกที่กล่าวถึง เช่นการจัดทำดัชนีฟิลด์เพศ (M / F) นั้นมีการใช้งานเพียงเล็กน้อยเท่านั้นมันเป็นเรื่องง่ายที่จะสแกนตารางและหาค่า ~ 50% ที่ตรงกัน หากมีการระบุไว้หลังจากสิ่งที่เจาะจงมากขึ้นในดัชนี (เช่น [วันเกิด, เพศ]) นั้นดีกว่า - คุณอาจต้องการเพศชายทุกคนที่เกิดในช่วงเวลาที่กำหนด

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

ฉันได้ลดตารางบางส่วนจาก 900MB เป็น 400MB เพียงเพราะพวกเขาไม่ได้สร้างกองไว้ล่วงหน้า http://msdn.microsoft.com/en-us/library/aa933131(v=sql.80).aspx

จัดระเบียบ / Rebuild

คุณควรตรวจสอบดัชนีแยกส่วน การกระจัดกระจายเล็กน้อยไม่เป็นไรอย่าได้ครอบงำ! http://technet.microsoft.com/en-us/library/ms189858.aspxรู้ถึงความแตกต่างระหว่างการจัดระเบียบใหม่และสร้างใหม่!

ทบทวนเป็นประจำ

การเปลี่ยนแปลงการค้นหาการเปลี่ยนแปลงปริมาณข้อมูลคุณสมบัติใหม่จะถูกเพิ่มการลบแบบเก่า คุณควรจะดูพวกเขาเดือนละครั้ง (หรือบ่อยกว่านั้นถ้าคุณมีปริมาณมาก) และมองหาที่ที่คุณสามารถช่วยฐานข้อมูลออก!

เท่าไหร่

ในวิดีโอล่าสุดเบรนต์แนะนำ (โดยทั่วไป) ไม่เกิน 5 ดัชนีบนโต๊ะที่มีการเขียนจำนวนมาก (เช่นตารางคำสั่ง) และไม่เกิน 10 ถ้ามันอ่านมากกว่าที่เขียน (เช่นตารางการบันทึกสำหรับการวิเคราะห์) http: / /www.youtube.com/watch?v=gOsflkQkHjg

Adj] ทั้งหมด, รวมทั้งหมด, รวมทั้งสิ้น

มันขึ้นอยู่กับ!

ระยะทางของคุณแตกต่างกันไปตามฐานข้อมูล ครอบคลุมชัดเจน (นามสกุลพนักงานวันที่สั่งซื้อ ฯลฯ ) ในตารางขนาดใหญ่ของคุณ (ตอนนี้ / อนาคต) ตรวจสอบทบทวนและปรับตามความจำเป็น ควรเป็นส่วนหนึ่งของรายการตรวจสอบประจำของคุณเมื่อจัดการฐานข้อมูลของคุณ :)

หวังว่านี่จะช่วยได้!


14

โดยทั่วไปจะมีภาระงานเฉพาะ (แบบสอบถาม) และทดสอบผลกระทบของดัชนีใหม่แต่ละรายการในปริมาณงานอย่างระมัดระวัง กระบวนการวนซ้ำนี้ควรมีการวิเคราะห์อย่างรอบคอบเกี่ยวกับแผนการดำเนินการซึ่งจะเปิดเผยดัชนีที่ใช้ หัวข้อของการวิเคราะห์แบบสอบถามมีความยาวและเริ่มต้นด้วยบท MSDN เฉพาะการวิเคราะห์แบบสอบถามเป็นทางออกที่ดี

บางครั้งเมื่อเวิร์กโหลดซับซ้อนเกินไปหรือความรู้เกี่ยวกับการออกแบบฐานข้อมูลเป็นแบบร่างหนึ่งใช้Database Engine Tuning Advisorซึ่งทำการวิเคราะห์อัตโนมัติของเวิร์กโหลดของคุณและเสนอดัชนีบางอย่าง แน่นอนข้อเสนอควรได้รับการวิเคราะห์อย่างรอบคอบและควรวัดผลกระทบทันที

ดังนั้นหากคุณทำตามความคิดของฉันการเพิ่มดัชนีและการวัดผลกระทบเป็นเพียงกรณีของการทดสอบ A / B : คุณเรียกใช้เวิร์กโหลดของคุณโดยไม่มีดัชนีเป็นเส้นฐานจากนั้นคุณรันด้วยดัชนีการวัดและเปรียบเทียบ ด้วยเส้นฐานแล้วตัดสินใจโดยอิงจากการวัดและการวัดหากผลกระทบเป็นประโยชน์ ภาระงานที่ดีที่สุดคือชุดทดสอบที่มีคุณภาพดี แต่มันยังสามารถเป็น replay ของภาระงานจับดูวิธีการ: Replay ติดตามแฟ้ม

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


7

เริ่มต้นด้วย SQL 2005, SQL Server มีDMVที่บอกให้คุณทราบว่าโปรแกรมฐานข้อมูลจะใช้อะไรสำหรับดัชนีถ้ามีอยู่ มุมมองสามารถบอกคุณได้ว่าคอลัมน์ใดควรเป็นคอลัมน์สำคัญซึ่งควรรวมคอลัมน์ใดและที่สำคัญที่สุดคือต้องใช้ดัชนีกี่ครั้ง

แนวทางที่ดีคือการเรียงลำดับเคียวรีดัชนีที่หายไปตามจำนวนการค้นหาและพิจารณาการเพิ่มดัชนีบนสุดก่อน

ดูเพิ่มเติมที่: เอกสาร MS DMV อย่างเป็นทางการ


-1

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

มีข้อความค้นหาสถิติเล็กน้อยที่บอกจำนวนเวลาที่สืบค้น เริ่มด้วยสิ่งที่ช้าที่สุด ถ้าเพรดิเคตแบบสอบถามไม่มีดัชนีการสร้างจะช่วยได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.