ที่หนึ่งควรใส่ดัชนีในตารางมิติเวลา?


10

หลังจากอ่านคำถามและคำตอบจากเว็บไซต์นี้เกี่ยวกับดัชนีคำถามมาถึงใจของฉัน

จะเกิดอะไรขึ้นหากใครใช้ตารางมิติเวลาที่มีระดับความละเอียดต่ำกว่าเป็นวัน ควรวางดัชนีไว้ที่ไหน?

Randy Melder ในคำถาม: “ index” หมายถึงอะไรใน RDBMS กล่าวว่า :

คิดว่าดัชนีเป็น "สารบัญ" ... นั่นคือรายการของตัวชี้ที่เรียงลำดับไปยังตำแหน่งในไฟล์หรือที่รู้จักกันว่าออฟเซ็ต

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

คำถามของฉันคือ: เราควรใส่ดัชนีสำหรับฟิลด์เหล่านั้นทั้งหมดหรือไม่

วันนี้เป็นวันที่ไม่เหมือนใครดังนั้นสำหรับฉันฉันเข้าใจการใช้ดัชนีอย่างสมบูรณ์แบบ แต่รหัสประจำสัปดาห์จะมี7 ครั้งรหัสเดือนจะมี30/31 ครั้งและรหัสไตรมาสจะมี120 ครั้งขึ้นไป

  • เราควรใส่ดัชนีสำหรับฟิลด์เหล่านั้นหรือไม่
  • มันจะยังคงมีประโยชน์หรือไม่

ฉันถามคุณว่าเพราะในคำถามเดียวกัน David Spillett ตอบว่า:

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

ดังนั้นสิ่งที่จะเป็นข้อควรพิจารณาที่ดีที่สุดสำหรับมิติเวลา?

คำตอบ:


7

คุณน่าจะไม่เจอกับปัญหาการเขียนเนื่องจากฉันคิดว่านี่จะเป็นสิ่งที่สร้างขึ้นครั้งเดียว (หรือปีละครั้ง) แล้วก็ไม่ได้สัมผัส

แต่การใช้ดัชนีน่าจะเป็นอุปสรรคหากคุณทำการค้นหารายสัปดาห์ ... ปัญหาคือถ้าใช้ดัชนีมันอาจสแกนมันก่อนแล้วจึงหยิบแต่ละระเบียนออกจากตารางทีละตัวซึ่งเมื่อคุณ ' กำลังดึงระเบียนมากกว่า 5-20% ของเรคคอร์ดโดยทั่วไปการสแกนแบบเต็มตารางจะเร็วกว่าและจากนั้นปล่อยเร็กคอร์ดที่คุณไม่สนใจ

ฉันไม่รู้เกี่ยวกับ RDBMS สำคัญใด ๆ ที่ไม่ได้ปรับให้เหมาะสมเมื่อเป็นข้อมูลที่กระจายอย่างดี หากการกระจายไม่ดี (เช่นหนึ่งในค่าในคอลัมน์เกิดขึ้น 95% ของเวลา แต่ยังมีค่าอื่น ๆ ที่เป็นไปได้) คุณอาจต้องคำนวณฮิสโตแกรมบนโต๊ะและไม่ใช้ตัวยึดตำแหน่งสำหรับการค้นหา เพื่อให้เคียวรีเครื่องมือเพิ่มประสิทธิภาพมีค่าการค้นหาเมื่อสร้างแผนการดำเนินการ

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


5

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


มีใครอื่นนอกจากฉันที่ได้ยินเสียงของ Paul Randal ทุกครั้งที่พวกเขาพูดหรืออ่าน "ขึ้นอยู่กับ" เกี่ยวกับฐานข้อมูลหรือไม่? : p
AndrewSQL

3

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

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


1

จนถึงตอนนี้กฎง่ายๆของฉันคือการไม่ใส่ดัชนีใด ๆ ลงในฐานข้อมูลการพัฒนาของฉันเลยในขณะที่ฉันกำลังทำงานกับมัน เมื่อฐานข้อมูลการผลิตมีขนาดใหญ่ขึ้นฉันใช้การบันทึกฐานข้อมูลและEXPLAINหาว่าต้องใช้การจัดทำดัชนีอย่างไรจากนั้นสร้างเฉพาะดัชนีที่จำเป็น สิ่งนี้ใช้ได้ดีตราบใดที่การใช้ฐานข้อมูลเพิ่มขึ้นเรื่อย ๆ และทำให้ดัชนีมีค่าน้อย

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

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