ระหว่างการวิเคราะห์คำ SQL Server sqllang!DecodeCompOp
จะเรียกเพื่อกำหนดชนิดของตัวดำเนินการเปรียบเทียบที่มีอยู่:
สิ่งนี้เกิดขึ้นได้ดีก่อนที่ทุกสิ่งในเครื่องมือเพิ่มประสิทธิภาพจะเกี่ยวข้อง
จากผู้ประกอบการเปรียบเทียบ (Transact-SQL)
ติดตามรหัสโดยใช้ดีบักเกอร์และสัญลักษณ์สาธารณะ * sqllang!DecodeCompOp
ส่งคืนค่าใน register eax
** ดังนี้:
╔════╦══════╗
║ Op ║ Code ║
╠════╬══════╣
║ < ║ 1 ║
║ = ║ 2 ║
║ <= ║ 3 ║
║ !> ║ 3 ║
║ > ║ 4 ║
║ <> ║ 5 ║
║ != ║ 5 ║
║ >= ║ 6 ║
║ !< ║ 6 ║
╚════╩══════╝
!=
และ<>
ทั้งคู่ส่งคืน 5 ดังนั้นจะแยกไม่ออกในการดำเนินการในภายหลังทั้งหมด (รวมถึงการรวบรวม & การเพิ่มประสิทธิภาพ)
แม้ว่ารองไปยังจุดดังกล่าวข้างต้นก็ยังเป็นไปได้ (เช่นการใช้สถานะการสืบค้นกลับไม่มีเอกสาร 8605) จะมองไปที่ต้นไม้ตรรกะส่งผ่านไปยังเพิ่มประสิทธิภาพในการยืนยันว่าทั้งสอง!=
และ<>
แมปไปScaOp_Comp x_cmpNe
(ไม่เท่ากันเกลาเปรียบเทียบประกอบการ)
ตัวอย่างเช่น:
SELECT P.ProductID FROM Production.Product AS P
WHERE P.ProductID != 4
OPTION (QUERYTRACEON 3604, QUERYTRACEON 8605);
SELECT P.ProductID FROM Production.Product AS P
WHERE P.ProductID <> 4
OPTION (QUERYTRACEON 3604, QUERYTRACEON 8605);
ทั้งผลิต:
LogOp_Project QCOL: [P] .ProductID
LogOp_Select
LogOp_ รับ TBL: การผลิตผลิตภัณฑ์ (นามแฝง TBL: P)
ScaOp_Comp x_cmpNe
ScaOp_Identifier QCOL: [P] .ProductID
ScaOp_Const TI (int, ML = 4) XVAR (int, ไม่ได้เป็นเจ้าของ, ค่า = 4)
AncOp_PrjList
เชิงอรรถ
* ฉันใช้WinDbg ; debuggers อื่น ๆ ที่มีอยู่ สัญลักษณ์สาธารณะมีให้บริการผ่านเซิร์ฟเวอร์สัญลักษณ์ Microsoft ปกติ สำหรับข้อมูลเพิ่มเติมดูลึกลงไปใน SQL Server โดยใช้ Minidumpsโดยทีมที่ปรึกษาลูกค้าSQL ServerและSQL Server Debugging ด้วย WinDbg - คำแนะนำโดย Klaus Aschenbrenner
** การใช้ EAX บนอนุพันธ์ของ Intel แบบ 32 บิตสำหรับค่าส่งคืนจากฟังก์ชันนั้นเป็นเรื่องปกติ แน่นอนว่า Win32 ABI ทำอย่างนั้นและฉันค่อนข้างมั่นใจว่ามันสืบทอดการฝึกฝนตั้งแต่สมัยโบราณใน MS-DOS ซึ่ง AX ใช้เพื่อจุดประสงค์เดียวกัน - Michael Kjörling