ผลกระทบของดัชนีในคำสั่งการอัพเดทที่คอลัมน์อัพเดตไม่ได้อยู่ในดัชนี


16

ฉันตลอดเวลาเห็นคนบอกว่าดัชนีชะลอตัวลงupdate, และdelete insertสิ่งนี้ถูกใช้เป็นคำสั่งแบบครอบคลุมราวกับว่ามันเป็นค่าสัมบูรณ์

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

ใน SQL Server และฉันเชื่อ / เข้าใจ DBMS อื่น ๆ ส่วนใหญ่ดัชนีของคุณจะถูกสร้างขึ้นตามคอลัมน์เฉพาะที่คุณระบุ ส่วนแทรกและการลบจะมีผลกับทั้งแถวเสมอดังนั้นจึงไม่มีวิธีที่จะไม่ส่งผลกระทบต่อดัชนี แต่การปรับปรุงดูเหมือนจะมีความเป็นเอกลักษณ์มากกว่านี้เล็กน้อย

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

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


so there is no way they will not affect the indexยกเว้นดัชนีที่กรอง ...
usr

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

คำตอบ:


6

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

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

แน่นอนการอัปเดตคอลัมน์ที่มีปริมาณข้อมูลมากขึ้นอย่างมากอาจทำให้เกิดการย้ายแถวไปยังหน้าอื่น ๆ และอื่น ๆ


1
SQL Server ถูกกล่าวถึงใน OP ฉันเพิ่มแท็กดังนั้นฉันคิดว่าคุณสามารถสมมติว่า SQL Server
Tom V - Team Monica

10

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

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

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

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

  2. การเปลี่ยนแปลงดัชนีส่งผลให้แผนการดำเนินการไม่ถูกต้องสำหรับแผนใด ๆ ที่อ้างอิงตารางต้นแบบ เมื่อแผนการดำเนินการเหล่านั้นถูกคอมไพล์ใหม่ประสิทธิภาพอาจเปลี่ยนแปลงในเชิงลบสำหรับบางแบบสอบถาม

  3. การปรับเปลี่ยนดัชนีอาจส่งผลให้เกิดข้อผิดพลาดในการค้นหาที่ไม่มีการส่งคืนก่อนหน้านี้ ใช้กรณีของดัชนีที่กรองที่ใช้เพื่อส่งคืนวันที่ที่อยู่ในฟิลด์ varchar หากตัวกรองตัดแถวใด ๆ ที่ไม่ได้เป็นวันที่และตัวกรองนั้นเปลี่ยนไปภายหลังแบบสอบถามที่อาศัยดัชนีนั้นอาจล้มเหลวเมื่อพยายามแปลงข้อมูลที่ไม่ใช่วันที่

  4. ดัชนีใหม่อาจทำให้ลำดับของการดำเนินการเปลี่ยนแปลงทำให้เกิดการหยุดชะงักที่เป็นไปได้ซึ่งไม่เคยเกิดขึ้นมาก่อน


"พา ธ ของรหัสที่จำเป็นสำหรับการอัปเดตเมื่อดัชนีไม่ได้รับผลกระทบยังคงต้องได้รับการประเมิน" นี่ไม่เป็นความจริง ขั้นตอนการรวบรวม / การเพิ่มประสิทธิภาพจะทราบดีว่าดัชนีใดที่จำเป็นต้องได้รับการอัปเดตหากมีและจะสร้างแผนตามลำดับ คำสั่ง UPDATE ที่ไม่ได้แก้ไข (ประกาศในรายการ SET) คอลัมน์ในดัชนี (รวมถึง INCLUDE และคอลัมน์คีย์กลุ่ม) จะไม่ต้องอัปเดตดัชนีนั้นและขั้นตอนการดำเนินการจะไม่แตะต้องเลย ลบและแทรกอย่างชัดเจนสัมผัสคอลัมน์ทั้งหมด (ตรรกะ) และต้องปรับปรุงดัชนีทั้งหมด
Remus Rusanu

@RemusRusanu แต่ไม่จำเป็นต้องประเมินหากสามารถใช้ดัชนีเพื่อค้นหาแถวที่จำเป็นต้องอัปเดต
Tom V - Team Monica

@RemusRusanu - ฉันคิดว่าเมื่อ QO ได้รวบรวมแผนไม่จำเป็นต้องใช้ CPU อีกต่อไป อย่างไรก็ตามเพื่อให้ได้แผนรวบรวมมันแน่นอนต้องทำ หากมีการรวบรวมแผนบ่อยครั้งอาจทำให้เกิดความแตกต่างเล็กน้อย
Max Vernon

@TomV โดยใช้ดัชนีเพื่อค้นหาแถวตัวเลือกลบ / อัปเดตเป็นหัวข้อที่แตกต่างอย่างสิ้นเชิง หากเป็นเช่นนั้นข้อดีของการค้นหาแถวด้วยดัชนีควรทำให้เกิดปัญหาด้านต้นทุนการบำรุงรักษาดัชนี
Remus Rusanu

@ MaxVernon ฉันจะยืนยันว่าไม่มีสถานการณ์ที่ถูกต้องของการคอมไพล์ซ้ำของ DML บ่อยครั้ง (UPDATE) ฉันซื้อบางกรณีสำหรับการคอมไพล์แบบ ad-hoc ที่ถูกต้อง (หลีกเลี่ยงไม่ได้?) แต่ DML แอปประเภทใดบ้างที่สามารถสร้างคำสั่ง UPDATE ที่ไม่ซ้ำใครแบบเฉพาะกิจได้ recompilations บ่อยครั้งด้วย DML ส่งเสียงดัง "Parameterize me"
Remus Rusanu

-2

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

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