การแสดงเคียวรีโดยใช้ไวยากรณ์ที่แตกต่างกันบางครั้งสามารถช่วยสื่อสารความต้องการของคุณในการใช้ดัชนีที่ไม่ทำคลัสเตอร์กับเครื่องมือเพิ่มประสิทธิภาพ คุณควรหาแบบฟอร์มด้านล่างนี้ให้แผนการที่คุณต้องการ:
SELECT
[ID],
[DeviceID],
[IsPUp],
[IsWebUp],
[IsPingUp],
[DateEntered]
FROM [dbo].[Heartbeats]
WHERE
[ID] IN
(
-- Keys
SELECT TOP (1000)
[ID]
FROM [dbo].[Heartbeats]
WHERE
[DateEntered] >= CONVERT(datetime, '2011-08-30', 121)
AND [DateEntered] < CONVERT(datetime, '2011-08-31', 121)
);
เปรียบเทียบแผนนั้นกับแผนที่สร้างขึ้นเมื่อดัชนีที่ไม่ใช่คลัสเตอร์ถูกบังคับด้วยคำใบ้:
SELECT TOP (1000)
*
FROM [dbo].[Heartbeats] WITH (INDEX(CommonQueryIndex))
WHERE
[DateEntered] BETWEEN '2011-08-30' and '2011-08-31';
โดยพื้นฐานแล้วแผนจะเหมือนกัน (การค้นหาคีย์ไม่มีอะไรมากไปกว่าการค้นหาในดัชนีคลัสเตอร์) รูปแบบแผนทั้งสองจะทำการค้นหาเพียงครั้งเดียวบนดัชนีที่ไม่ทำคลัสเตอร์และมีการค้นหาสูงสุด 1,000 รายการในดัชนีคลัสเตอร์
ความแตกต่างที่สำคัญอยู่ในตำแหน่งของตัวดำเนินการสูงสุด การวางตำแหน่งระหว่างการค้นหาทั้งสองนั้น Top จะป้องกันเครื่องมือเพิ่มประสิทธิภาพจากการแทนที่การค้นหาทั้งสองด้วยการสแกนที่เทียบเท่าเชิงตรรกะของดัชนีคลัสเตอร์ เครื่องมือเพิ่มประสิทธิภาพทำงานโดยการแทนที่ส่วนของแผนลอจิคัลด้วยการดำเนินการเชิงสัมพันธ์ที่เทียบเท่ากัน ด้านบนไม่ใช่ตัวดำเนินการสัมพันธ์ดังนั้นการเขียนซ้ำจะป้องกันการแปลงเป็นการสแกนดัชนีแบบคลัสเตอร์ หากเครื่องมือเพิ่มประสิทธิภาพสามารถเปลี่ยนตำแหน่งผู้ให้บริการอันดับสูงสุดได้ก็ยังคงต้องการสแกนมากกว่าการค้นหา + การค้นหาเนื่องจากวิธีการประมาณค่าใช้จ่าย
ค่าใช้จ่ายในการสแกนและแสวงหา
ในระดับที่สูงมากรูปแบบค่าใช้จ่ายของเครื่องมือเพิ่มประสิทธิภาพสำหรับการสแกนและการค้นหานั้นค่อนข้างง่าย: มันประมาณว่าการค้นหาแบบสุ่ม 320 ครั้งมีค่าใช้จ่ายเท่ากันกับการอ่าน 1,350 หน้าในการสแกน สิ่งนี้อาจมีความคล้ายคลึงกับความสามารถของฮาร์ดแวร์ของระบบ I / O ที่ทันสมัย แต่ก็ทำงานได้ดีพอ ๆ กับแบบจำลองที่ใช้งานได้จริง
ตัวแบบยังสร้างข้อสันนิษฐานที่ทำให้ง่ายขึ้นจำนวนหนึ่งข้อที่สำคัญคือว่าแบบสอบถามทุกข้อจะเริ่มต้นโดยไม่มีหน้าข้อมูลหรือดัชนีอยู่ในแคชแล้ว ความหมายก็คือว่าทุก I / O จะส่งผลให้ I / O ทางกายภาพ - แม้ว่าจะไม่ค่อยเป็นกรณีในทางปฏิบัติ แม้จะมีแคชเย็นการดึงข้อมูลล่วงหน้าและอ่านล่วงหน้าหมายความว่าหน้าเว็บที่ต้องการมีแนวโน้มที่จะอยู่ในหน่วยความจำตามเวลาที่ตัวประมวลผลแบบสอบถามต้องการ
สิ่งที่ต้องพิจารณาอีกประการหนึ่งคือการร้องขอแถวแรกที่ไม่ได้อยู่ในหน่วยความจำจะทำให้หน้าทั้งหมดดึงจากดิสก์ คำร้องขอที่ตามมาสำหรับแถวในหน้าเดียวกันนั้นมีแนวโน้มว่าจะไม่เกิดขึ้นกับ I / O จริง แบบจำลองการคิดต้นทุนนั้นมีตรรกะในการพิจารณาเอฟเฟกต์เช่นนี้ แต่มันไม่สมบูรณ์แบบ
ทุกสิ่งเหล่านี้ (และอื่น ๆ ) หมายถึงเครื่องมือเพิ่มประสิทธิภาพมีแนวโน้มที่จะเปลี่ยนเป็นการสแกนเร็วกว่าที่ควรจะเป็น I / O แบบสุ่มนั้นมีราคาแพงกว่า I / O ตามลำดับหากผลการดำเนินการทางกายภาพการเข้าถึงหน้าในหน่วยความจำนั้นรวดเร็วมาก แม้ว่าจะต้องการการอ่านแบบฟิสิคัลการสแกนอาจไม่ส่งผลให้เกิดการอ่านตามลำดับเนื่องจากการแตกแฟรกเมนต์และการค้นหาอาจจัดวางร่วมกันเพื่อให้รูปแบบนั้นเรียงตามลำดับ เพิ่มไปที่ลักษณะการเปลี่ยนแปลงที่มีประสิทธิภาพของระบบ I / O ที่ทันสมัย (โดยเฉพาะอย่างยิ่งโซลิดสเตต) และทุกสิ่งเริ่มดูสั่นคลอนมาก
เป้าหมายแถว
การปรากฏตัวของผู้ประกอบการยอดนิยมในแผนปรับเปลี่ยนวิธีการคิดต้นทุน เครื่องมือเพิ่มประสิทธิภาพฉลาดพอที่จะรู้ว่าการค้นหา 1,000 แถวโดยใช้การสแกนจะไม่ต้องสแกนดัชนีทั้งคลัสเตอร์ - สามารถหยุดได้ทันทีที่พบ 1,000 แถว มันตั้งค่า 'เป้าหมายแถว' จำนวน 1,000 แถวที่ตัวดำเนินการด้านบนและใช้ข้อมูลสถิติเพื่อกลับมาทำงานอีกครั้งเพื่อประเมินจำนวนแถวที่คาดว่าจะต้องการจากแหล่งแถว (การสแกนในกรณีนี้) ผมเขียนเกี่ยวกับรายละเอียดของการคำนวณนี้ที่นี่
รูปภาพที่ปรากฏในคำตอบนี้ถูกสร้างขึ้นโดยใช้SQL ยามแผน Explorer ที่