ในแผนการดำเนินการของเซิร์ฟเวอร์ SQL ความแตกต่างระหว่าง Index Scan และ Index Seek คืออะไร
ฉันใช้ SQL Server 2005
ในแผนการดำเนินการของเซิร์ฟเวอร์ SQL ความแตกต่างระหว่าง Index Scan และ Index Seek คืออะไร
ฉันใช้ SQL Server 2005
คำตอบ:
การสแกนดัชนีคือที่ที่เซิร์ฟเวอร์ SQL อ่านดัชนีทั้งหมดเพื่อค้นหารายการที่ตรงกันซึ่งเวลาที่ใช้จะเป็นไปตามสัดส่วนกับขนาดของดัชนี
การค้นหาดัชนีคือที่ที่เซิร์ฟเวอร์ SQL ใช้โครงสร้าง b-tree ของดัชนีเพื่อค้นหาระเบียนที่ตรงกันโดยตรง (ดูhttp://mattfleming.com/node/192สำหรับแนวคิดเกี่ยวกับวิธีการทำงาน) - เวลาที่ใช้เป็นสัดส่วนเท่านั้น จำนวนบันทึกที่ตรงกัน
กฎพื้นฐานที่ต้องปฏิบัติตามคือการสแกนไม่ดีการค้นหานั้นดี
สแกนดัชนี
เมื่อ SQL Server ทำการสแกนจะโหลดอ็อบเจ็กต์ที่ต้องการอ่านจากดิสก์ลงในหน่วยความจำจากนั้นอ่านอ็อบเจ็กต์นั้นจากบนลงล่างเพื่อค้นหาเรกคอร์ดที่ต้องการ
Index Seek
เมื่อ SQL Server ทำการค้นหาจะรู้ว่าข้อมูลจะอยู่ที่ใดในดัชนีดังนั้นจึงโหลดดัชนีจากดิสก์ไปที่ส่วนของดัชนีที่ต้องการโดยตรงและอ่านว่าข้อมูลที่ต้องการสิ้นสุดลงที่ใด . เห็นได้ชัดว่านี่เป็นการดำเนินการที่มีประสิทธิภาพมากกว่าการสแกนเนื่องจาก SQL รู้แล้วว่าข้อมูลที่กำลังค้นหานั้นอยู่ที่ใด
ฉันจะแก้ไขแผนการดำเนินการเพื่อใช้การค้นหาแทนการสแกนได้อย่างไร
เมื่อ SQL Server กำลังค้นหาข้อมูลของคุณอาจเป็นหนึ่งในสิ่งที่ใหญ่ที่สุดซึ่งจะทำให้ SQL Server เปลี่ยนจากการค้นหาเป็นการสแกนคือเมื่อคอลัมน์บางคอลัมน์ที่คุณกำลังมองหาไม่รวมอยู่ในดัชนีที่คุณต้องการใช้ ส่วนใหญ่มักจะทำให้ SQL Server ถอยกลับไปทำการสแกนดัชนีคลัสเตอร์เนื่องจากดัชนีคลัสเตอร์มีคอลัมน์ทั้งหมดในตาราง นี่เป็นหนึ่งในเหตุผลที่ใหญ่ที่สุด (ในความคิดของฉันอย่างน้อย) ที่ตอนนี้เราสามารถรวมคอลัมน์ในดัชนีได้โดยไม่ต้องเพิ่มคอลัมน์เหล่านั้นในคอลัมน์ที่จัดทำดัชนีของดัชนี การรวมคอลัมน์เพิ่มเติมในดัชนีทำให้เราเพิ่มขนาดของดัชนี แต่เราอนุญาตให้ SQL Server อ่านดัชนีโดยไม่ต้องกลับไปที่ดัชนีคลัสเตอร์หรือไปที่ตารางด้วยตนเองเพื่อรับค่าเหล่านี้
อ้างอิง
สำหรับข้อมูลเกี่ยวกับข้อมูลจำเพาะของแต่ละตัวดำเนินการเหล่านี้ภายในแผน SQL Server Execution โปรดดู ....
คำตอบสั้น ๆ :
สแกนดัชนี: แตะทุกแถวยกเว้นบางคอลัมน์
การค้นหาดัชนี: แตะบางแถวและบางคอลัมน์
ด้วยการสแกนดัชนีแถวทั้งหมดในดัชนีจะถูกสแกนเพื่อค้นหาแถวที่ตรงกัน สิ่งนี้สามารถมีประสิทธิภาพสำหรับโต๊ะขนาดเล็ก เมื่อใช้ Index Seek จะต้องแตะแถวที่ตรงตามเกณฑ์เท่านั้นและโดยทั่วไปจะมีประสิทธิภาพมากกว่า
การสแกนดัชนีเกิดขึ้นเมื่อไม่พบนิยามดัชนีในแถวเดียวเพื่อตอบสนองเพรดิเคตการค้นหา ในกรณีนี้ SQL Server ต้องสแกนหลายหน้าเพื่อค้นหาช่วงของแถวที่ตรงตามเพรดิเคตการค้นหา
ในกรณีของ Index Seek SQL Server จะค้นหาแถวเดียวที่ตรงกับเพรดิเคตการค้นหาโดยใช้นิยามดัชนี
Index Seeks ดีกว่าและมีประสิทธิภาพมากขึ้น
การสแกนจะสัมผัสทุกแถวในตารางแม้ว่าจะเป็นสิ่งที่คุณตามมาหรือไม่ก็ตาม
การค้นหาจะดูเฉพาะแถวที่คุณกำลังมองหา
การค้นหามักจะดีกว่าการสแกนเนื่องจากมีประสิทธิภาพมากกว่าในการค้นหาข้อมูล
คำอธิบายที่ดีสามารถพบได้ที่นี่