รหัสตัวอย่างในรายการเชื่อมต่อนี้
แสดงข้อบกพร่องที่
SELECT COUNT(*)
FROM dbo.my_splitter_1('2') L1
INNER JOIN dbo.my_splitter_1('') L2
ON L1.csv_item = L2.csv_item
ส่งคืนผลลัพธ์ที่ถูกต้อง แต่ผลลัพธ์ต่อไปนี้จะส่งกลับผลลัพธ์ที่ไม่ถูกต้อง (เมื่อปี 2014 โดยใช้เครื่องมือประมาณการ Cardinality ใหม่)
SELECT
(SELECT COUNT(*)
FROM dbo.my_splitter_1('2') L1
INNER JOIN dbo.my_splitter_1('') L2
ON L1.csv_item = L2.csv_item)
เนื่องจากมันโหลดผลลัพธ์อย่างไม่ถูกต้องสำหรับ L2 ลงในสปูลนิพจน์ย่อยทั่วไปจากนั้นรีเพลย์ผลลัพธ์ของผลลัพธ์นั้นสำหรับผลลัพธ์ L1
ฉันอยากรู้ว่าทำไมความแตกต่างของพฤติกรรมระหว่างสองข้อความค้นหา Trace ธง 8675 แสดงให้เห็นว่าคนที่ทำงานเข้ามาและเป็นคนที่ไม่เข้าsearch(0) - transaction processing
search(1) - quick plan
ดังนั้นฉันคิดว่าความพร้อมใช้งานของกฎการแปลงเพิ่มเติมอยู่เบื้องหลังความแตกต่างในพฤติกรรม (ปิดการใช้งาน BuildGbApply หรือGenGbApplySimpleดูเหมือนจะแก้ไขได้)
แต่ทำไมทั้งสองแผนสำหรับข้อความค้นหาที่คล้ายกันเหล่านี้จึงพบกับขั้นตอนการเพิ่มประสิทธิภาพที่แตกต่างกัน จากสิ่งที่ฉันอ่านsearch (0)
ต้องมีอย่างน้อยสามตารางและเงื่อนไขนั้นไม่พบในตัวอย่างแรก