โครงการของเราดำเนินงานฐานข้อมูลขนาดใหญ่และซับซ้อนมาก ประมาณหนึ่งเดือนที่แล้วเราสังเกตว่าช่องว่างที่ใช้โดยคอลัมน์ที่มีดัชนีซึ่งมีค่า Null มีขนาดใหญ่เกินไป เพื่อตอบสนองต่อสิ่งนั้นฉันเขียนเป็นสคริปต์ที่จะค้นหาดัชนีคอลัมน์เดี่ยวแบบไดนามิกทั้งหมดที่มีค่า Null มากกว่า 1% จากนั้นปล่อยและสร้างดัชนีเหล่านั้นใหม่เป็นดัชนีที่กรองตามเงื่อนไขที่ค่านั้นไม่ใช่ค่า NULL สิ่งนี้จะดรอปและสร้างดัชนีหลายร้อยรายการใหม่ตลอดทั้งฐานข้อมูลและเพิ่มพื้นที่ว่างเกือบ 15% ของฐานข้อมูลทั้งหมดที่ใช้
ตอนนี้ฉันมีคำถามสองข้อเกี่ยวกับเรื่องนี้:
A) ข้อเสียของการใช้ดัชนีที่ถูกกรองในแบบนี้คืออะไร? ฉันจะสมมติว่ามันจะปรับปรุงประสิทธิภาพเท่านั้น แต่มีความเสี่ยงด้านประสิทธิภาพหรือไม่?
B) เราได้รับข้อผิดพลาด ( 'ไม่สามารถวางดัชนี XYZ ได้เนื่องจากไม่มีอยู่หรือคุณไม่ได้รับอนุญาต' ) ในการทำดัชนีหล่นและสร้างดัชนีใหม่แม้ว่าจะได้รับการตรวจสอบแล้วก็ตามทุกอย่างเป็นไปตามที่คาดไว้ สิ่งนี้จะเกิดขึ้นได้อย่างไร?
ขอบคุณสำหรับความช่วยเหลือใด ๆ !
แก้ไข:เพื่อตอบสนองต่อ @Thomas Kejser
สวัสดีและขอบคุณ แต่ปรากฎว่านี่เป็นหายนะ ในเวลานั้นเราไม่เข้าใจหลายสิ่งเช่น:
- ระหว่างการสืบค้น SQLOS จัดทำแผนดัชนีก่อนที่จะพิจารณาว่าไม่สามารถใช้ค่า NULL สำหรับการเข้าร่วมคอลัมน์ตาราง IE คุณจำเป็นต้องมีตัวกรองคำสั่งย่อย WHERE ที่เหมาะสมสำหรับดัชนีแต่ละตัวกรองที่ใช้ในแบบสอบถามมิฉะนั้นดัชนีจะไม่ถูกใช้เลย
- การวางและสร้างดัชนีและอัปเดตสถิติของพวกเขาซ้ำซ้อนอีกครั้งหลังจากนั้นอาจยังไม่เพียงพอที่จะสร้างแผนที่อัปเดตซึ่งเราคิดว่าพวกเขาจะทำ มันปรากฏขึ้นในบางกรณีเพียงปริมาณงานที่มากพอที่จะบังคับให้ SQL Server ประเมินแผนอีกครั้ง
- มีฟังก์ชั่น Exotics บางอย่างของตัววางแผนการดำเนินการที่ยากต่อการพิจารณาโดยสามัญสำนึกและตรรกะเพียงอย่างเดียว ด้วยความแตกต่างของการสร้างโค้ดที่ล้าหลังของคิวรีที่แตกต่างกันถึงแม้ว่าดัชนีที่ไร้ประโยชน์ดูเหมือนจะสามารถช่วยในสถิติและแผนคิวรีบางอย่างที่ถูกใช้ในคิวรีที่สำคัญ
ในท้ายที่สุดการเปลี่ยนแปลงเหล่านี้กลับคืนมา ดังนั้นดัชนีที่ถูกกรองจึงเป็นเครื่องมือที่ทรงพลัง แต่คุณต้องเข้าใจอย่างแท้จริงว่าข้อมูลใดถูกดึงมาจากคอลัมน์เหล่านั้น ในกรณีที่ดัชนีปกตินอกเหนือจากปัญหาพื้นที่ค่อนข้างง่ายต่อการใช้ดัชนีที่กรองจะแสดงวิธีแก้ไขปัญหาที่กำหนดเองมาก แน่นอนว่าไม่ใช่การแทนที่ดัชนีปกติ แต่เป็นการขยายในสถานการณ์พิเศษที่ต้องการ