ฉันแค่อยากรู้ว่าเหตุใดแบบสอบถามโดยรวมจึงทำงานเร็วขึ้นมากโดยมีGROUP BY
ประโยคมากกว่าไม่มี
ตัวอย่างเช่นแบบสอบถามนี้ใช้เวลาเกือบ 10 วินาทีในการเรียกใช้
SELECT MIN(CreatedDate)
FROM MyTable
WHERE SomeIndexedValue = 1
ในขณะนี้อันนี้ใช้เวลาน้อยกว่าหนึ่งวินาที
SELECT MIN(CreatedDate)
FROM MyTable
WHERE SomeIndexedValue = 1
GROUP BY CreatedDate
มีเพียงหนึ่งเดียวCreatedDate
ในกรณีนี้ดังนั้นคิวรีที่จัดกลุ่มจะส่งคืนผลลัพธ์เดียวกับกลุ่มที่ไม่ได้จัดกลุ่ม
ฉันสังเกตเห็นแผนการดำเนินการสำหรับแบบสอบถามที่สองจะแตกต่างกัน - แบบสอบถามที่สองใช้ Parallelism ในขณะที่แบบสอบถามแรกไม่
เป็นเรื่องปกติหรือไม่ที่เซิร์ฟเวอร์ SQL จะประเมินคิวรีแบบรวมแตกต่างกันถ้ามันไม่มี GROUP BY clause? และมีสิ่งที่ฉันสามารถทำได้เพื่อปรับปรุงประสิทธิภาพของแบบสอบถามที่ 1 โดยไม่ต้องใช้GROUP BY
คำสั่งหรือไม่
แก้ไข
ฉันเพิ่งเรียนรู้ว่าฉันสามารถใช้OPTION(querytraceon 8649)
ในการตั้งค่าใช้จ่ายค่าใช้จ่ายของความเท่าเทียมเป็น 0 ซึ่งทำให้แบบสอบถามใช้ความเท่าเทียมและลดรันไทม์เป็น 2 วินาทีแม้ว่าฉันจะไม่รู้ว่ามีข้อเสียในการใช้คำใบ้แบบสอบถามนี้หรือไม่
SELECT MIN(CreatedDate)
FROM MyTable
WHERE SomeIndexedValue = 1
OPTION(querytraceon 8649)
ฉันยังคงต้องการรันไทม์ที่สั้นกว่าเนื่องจากแบบสอบถามมีวัตถุประสงค์เพื่อเติมค่าตามการเลือกของผู้ใช้ดังนั้นควรเป็นแบบทันทีทันใดเหมือนกับคิวรีที่จัดกลุ่มไว้ ตอนนี้ฉันแค่ห่อคำถาม แต่ฉันรู้ว่านั่นไม่ใช่ทางออกที่ดีที่สุด
SELECT Min(CreatedDate)
FROM
(
SELECT Min(CreatedDate) as CreatedDate
FROM MyTable WITH (NOLOCK)
WHERE SomeIndexedValue = 1
GROUP BY CreatedDate
) as T
แก้ไข # 2
เพื่อตอบสนองต่อคำขอของ Martin สำหรับข้อมูลเพิ่มเติม :
ทั้งคู่CreatedDate
และSomeIndexedValue
มีดัชนีที่ไม่ซ้ำกันและไม่ทำคลัสเตอร์แยกต่างหาก SomeIndexedValue
จริง ๆ แล้วเป็นฟิลด์ varchar (7) แม้ว่ามันจะเก็บค่าตัวเลขที่ชี้ไปที่ PK (int) ของตารางอื่น ความสัมพันธ์ระหว่างสองตารางไม่ได้กำหนดไว้ในฐานข้อมูล ฉันไม่ควรเปลี่ยนฐานข้อมูลเลยและสามารถเขียนได้เฉพาะแบบสอบถามที่ข้อมูลแบบสอบถาม
MyTable
มีมากกว่า 3 ล้านเรคคอร์ดและแต่ละเรคคอร์ดได้รับการจัดกลุ่มเป็นของ ( SomeIndexedValue
) กลุ่มสามารถอยู่ที่ใดก็ได้ตั้งแต่ 1 ถึง 200,000 รายการ
MAXDOP
กำหนดระดับสูงสุดของความขนานซึ่ง จำกัด จำนวนตัวประมวลผลที่สามารถใช้แบบสอบถามได้ สิ่งนี้จะทำให้แบบสอบถามที่ 2 รันช้ากว่าแบบสอบถามที่ 1 เนื่องจากเป็นการลบความสามารถในการใช้ขนานซึ่งไม่ใช่สิ่งที่ฉันต้องการ