ดูเริ่มต้นที่แผนการดำเนินการแสดงว่านิพจน์1/0
ถูกกำหนดในตัวดำเนินการคำนวณสเกลาร์:
ตอนนี้ถึงแม้ว่าแผนการดำเนินการจะเริ่มดำเนินการในด้านซ้ายสุด, ซ้ำเรียกร้องOpen
และGetRow
วิธีการเกี่ยวกับการ iterators เด็กเพื่อให้ได้ผลลัพธ์, SQL Server 2005 และต่อมามีการเพิ่มประสิทธิภาพโดยการแสดงออกมักจะเป็นเพียงกำหนดโดย Compute เกลากับการประเมินผลการเลื่อนไปก่อนจนกว่าภายหลัง การดำเนินการต้องใช้ผลลัพธ์ :
ในกรณีนี้ผลลัพธ์นิพจน์จำเป็นเฉพาะเมื่อประกอบแถวเพื่อกลับไปยังไคลเอนต์ (ซึ่งคุณสามารถนึกได้ว่าเกิดขึ้นที่SELECT
ไอคอนสีเขียว) โดยตรรกะนั้นการประเมินผลที่เลื่อนออกไปจะหมายถึงการแสดงออกที่ไม่เคยประเมินเพราะแผนไม่สร้างแถวผลตอบแทน หากต้องการใช้แรงงานจุดเล็ก ๆ น้อย ๆ ทั้งดัชนีแบบไม่ค้นหาและการสแกนตารางจะส่งคืนแถวดังนั้นจึงไม่มีแถวที่จะรวบรวมเพื่อกลับไปยังไคลเอนต์
แต่มีการเพิ่มประสิทธิภาพที่แยกจากกันโดยการแสดงออกบางอย่างสามารถระบุว่าเป็นค่าคงที่รันไทม์และเพื่อให้การประเมินครั้งก่อนดำเนินการค้นหาเริ่มต้น ในกรณีนี้สิ่งบ่งชี้ที่เกิดขึ้นนี้สามารถพบได้ใน showplan XML (ดัชนีกลุ่มค้นหาแผนทางด้านซ้ายแผนสแกนตารางทางด้านขวา):
ฉันเขียนเพิ่มเติมเกี่ยวกับกลไกพื้นฐานและวิธีที่จะมีผลต่อประสิทธิภาพในการโพสต์บล็อกนี้ โดยใช้ข้อมูลที่มีให้เราสามารถแก้ไขแบบสอบถามแรกเพื่อให้ทั้งสองนิพจน์ได้รับการประเมินและแคชก่อนเริ่มการทำงาน:
select 1/0 * CONVERT(integer, @@DBTS)
from #temp
where id = 1
select 1/0
from #temp2
where id = 1
ตอนนี้แผนแรกยังมีการอ้างอิงนิพจน์คงที่และแบบสอบถามทั้งสองผลิตข้อความแสดงข้อผิดพลาด XML สำหรับแบบสอบถามแรกประกอบด้วย:
ข้อมูลเพิ่มเติม: คำนวณสเกลาร์นิพจน์และประสิทธิภาพ