แผนเซิร์ฟเวอร์ SQL: ความแตกต่างระหว่าง Index Scan / Index Seek


คำตอบ:


129

การสแกนดัชนีคือที่ที่เซิร์ฟเวอร์ SQL อ่านดัชนีทั้งหมดเพื่อค้นหารายการที่ตรงกันซึ่งเวลาที่ใช้จะเป็นไปตามสัดส่วนกับขนาดของดัชนี

การค้นหาดัชนีคือที่ที่เซิร์ฟเวอร์ SQL ใช้โครงสร้าง b-tree ของดัชนีเพื่อค้นหาระเบียนที่ตรงกันโดยตรง (ดูhttp://mattfleming.com/node/192สำหรับแนวคิดเกี่ยวกับวิธีการทำงาน) - เวลาที่ใช้เป็นสัดส่วนเท่านั้น จำนวนบันทึกที่ตรงกัน

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

3
ลิงก์ยังใช้งานได้หรือไม่ สำหรับฉันมันไม่ได้ผล โปรดช่วยถ้ามีลิงค์ที่อัปเดต
Ronak Agrawal

2
@RonakAgrawal ดูเหมือนว่าลิงก์จะตายไปแล้ว - อาจตรวจสอบwikipediaแทน?
Justin


77

กฎพื้นฐานที่ต้องปฏิบัติตามคือการสแกนไม่ดีการค้นหานั้นดี

สแกนดัชนี

เมื่อ SQL Server ทำการสแกนจะโหลดอ็อบเจ็กต์ที่ต้องการอ่านจากดิสก์ลงในหน่วยความจำจากนั้นอ่านอ็อบเจ็กต์นั้นจากบนลงล่างเพื่อค้นหาเรกคอร์ดที่ต้องการ

Index Seek

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


ฉันจะแก้ไขแผนการดำเนินการเพื่อใช้การค้นหาแทนการสแกนได้อย่างไร

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

อ้างอิง

สำหรับข้อมูลเกี่ยวกับข้อมูลจำเพาะของแต่ละตัวดำเนินการเหล่านี้ภายในแผน SQL Server Execution โปรดดู ....


7

คำตอบสั้น ๆ :

  • สแกนดัชนี: แตะทุกแถวยกเว้นบางคอลัมน์

  • การค้นหาดัชนี: แตะบางแถวและบางคอลัมน์


4

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


2

การสแกนดัชนีเกิดขึ้นเมื่อไม่พบนิยามดัชนีในแถวเดียวเพื่อตอบสนองเพรดิเคตการค้นหา ในกรณีนี้ SQL Server ต้องสแกนหลายหน้าเพื่อค้นหาช่วงของแถวที่ตรงตามเพรดิเคตการค้นหา

ในกรณีของ Index Seek SQL Server จะค้นหาแถวเดียวที่ตรงกับเพรดิเคตการค้นหาโดยใช้นิยามดัชนี

Index Seeks ดีกว่าและมีประสิทธิภาพมากขึ้น


0

การสแกนจะสัมผัสทุกแถวในตารางแม้ว่าจะเป็นสิ่งที่คุณตามมาหรือไม่ก็ตาม

การค้นหาจะดูเฉพาะแถวที่คุณกำลังมองหา

การค้นหามักจะดีกว่าการสแกนเนื่องจากมีประสิทธิภาพมากกว่าในการค้นหาข้อมูล

คำอธิบายที่ดีสามารถพบได้ที่นี่


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

1
สวัสดีจัสตินฉันเดาว่าคุณคงคิดว่าการสแกนตารางบางครั้งอาจจะดีกว่า Indexes Seek ดีกว่า Index Scan เสมอเว้นแต่เราจะพูดถึงคลัสเตอร์ แต่ในบางครั้งการสแกนตารางหรือการสแกนดัชนีคลัสเตอร์อาจมีประสิทธิภาพมากกว่าด้วยเหตุผลที่คุณกล่าวถึง แทนที่จะค้นหาดัชนีและรับฟิลด์ที่ไม่ได้อยู่ในดัชนีจากตารางบางครั้ง ms sql จะใช้ตารางแม้ว่าดัชนีจะมีฟิลด์เกณฑ์ก็ตาม
Jose Areas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.