ฉันมีสองตารางที่มีชื่อคอลัมน์พิมพ์และดัชนีคีย์เหมือนกัน หนึ่งในพวกเขามีที่ไม่ซ้ำกันดัชนีคลัสเตอร์ที่หนึ่ง ๆ มีที่ไม่ซ้ำกัน
การตั้งค่าการทดสอบ
สคริปต์การตั้งค่ารวมถึงสถิติที่เป็นจริง:
DROP TABLE IF EXISTS #left;
DROP TABLE IF EXISTS #right;
CREATE TABLE #left (
a char(4) NOT NULL,
b char(2) NOT NULL,
c varchar(13) NOT NULL,
d bit NOT NULL,
e char(4) NOT NULL,
f char(25) NULL,
g char(25) NOT NULL,
h char(25) NULL
--- and a few other columns
);
CREATE UNIQUE CLUSTERED INDEX IX ON #left (a, b, c, d, e, f, g, h)
UPDATE STATISTICS #left WITH ROWCOUNT=63800000, PAGECOUNT=186000;
CREATE TABLE #right (
a char(4) NOT NULL,
b char(2) NOT NULL,
c varchar(13) NOT NULL,
d bit NOT NULL,
e char(4) NOT NULL,
f char(25) NULL,
g char(25) NOT NULL,
h char(25) NULL
--- and a few other columns
);
CREATE CLUSTERED INDEX IX ON #right (a, b, c, d, e, f, g, h)
UPDATE STATISTICS #right WITH ROWCOUNT=55700000, PAGECOUNT=128000;
ความผิดพลาด
เมื่อฉันเข้าร่วมสองตารางเหล่านี้ในคีย์การจัดกลุ่มของพวกเขาฉันคาดว่าการรวม MERGE แบบหนึ่งต่อหลายคนเป็นเช่นนี้:
SELECT *
FROM #left AS l
LEFT JOIN #right AS r ON
l.a=r.a AND
l.b=r.b AND
l.c=r.c AND
l.d=r.d AND
l.e=r.e AND
l.f=r.f AND
l.g=r.g AND
l.h=r.h
WHERE l.a='2018';
นี่คือแผนแบบสอบถามที่ฉันต้องการ:
(ไม่เป็นไรคำเตือนพวกเขาต้องทำกับสถิติปลอม)
อย่างไรก็ตามหากฉันเปลี่ยนลำดับของคอลัมน์ในการเข้าร่วมเช่น:
SELECT *
FROM #left AS l
LEFT JOIN #right AS r ON
l.c=r.c AND -- used to be third
l.a=r.a AND -- used to be first
l.b=r.b AND -- used to be second
l.d=r.d AND
l.e=r.e AND
l.f=r.f AND
l.g=r.g AND
l.h=r.h
WHERE l.a='2018';
... สิ่งนี้เกิดขึ้น:
ตัวดำเนินการเรียงลำดับดูเหมือนว่าจะเรียงลำดับสตรีมตามลำดับที่ประกาศของการเข้าร่วมนั่นคือc, a, b, d, e, f, g, h
เพิ่มการดำเนินการบล็อกในแผนคิวรีของฉัน
สิ่งที่ฉันได้ดู
- ฉันลองเปลี่ยนคอลัมน์เป็น
NOT NULL
ผลลัพธ์เดียวกัน - สร้างตารางต้นฉบับด้วย
ANSI_PADDING OFF
แต่การสร้างด้วยANSI_PADDING ON
ไม่มีผลกับแผนนี้ - ฉันลอง
INNER JOIN
แทนLEFT JOIN
ไม่มีการเปลี่ยนแปลง - ฉันค้นพบมันใน 2014 SP2 Enterprise สร้างตัวแทนบน 2017 Developer (CU ปัจจุบัน)
- การลบส่วนคำสั่ง WHERE ในคอลัมน์ดัชนีชั้นนำจะสร้างแผนที่ดี แต่มันจะมีผลต่อผลลัพธ์ .. :)
ในที่สุดเราก็มาถึงคำถาม
- มันตั้งใจหรือไม่
- ฉันสามารถกำจัดการเรียงลำดับโดยไม่ต้องเปลี่ยนการสืบค้น (ซึ่งเป็นรหัสผู้ขายได้หรือไม่ดังนั้นฉันจึงค่อนข้างไม่ ... ) ฉันสามารถเปลี่ยนตารางและดัชนีได้