เมื่อพิจารณาการเข้าร่วมตารางที่สามอย่างง่ายประสิทธิภาพการค้นหาจะเปลี่ยนไปอย่างมากเมื่อมีการรวม ORDER BY แม้ว่าจะไม่มีการส่งคืนแถว สถานการณ์ปัญหาที่เกิดขึ้นจริงใช้เวลา 30 วินาทีเพื่อส่งกลับศูนย์แถว แต่เป็นทันทีเมื่อไม่รวม ORDER BY ทำไม?
SELECT *
FROM tinytable t /* one narrow row */
JOIN smalltable s on t.id=s.tinyId /* one narrow row */
JOIN bigtable b on b.smallGuidId=s.GuidId /* a million narrow rows */
WHERE t.foreignId=3 /* doesn't match */
ORDER BY b.CreatedUtc /* try with and without this ORDER BY */
ฉันเข้าใจว่าฉันสามารถมีดัชนีใน bigtable.smallGuidId ได้ แต่ฉันเชื่อว่ามันจะทำให้แย่ลงในกรณีนี้
นี่คือสคริปต์เพื่อสร้าง / เติมตารางสำหรับการทดสอบ อยากรู้อยากเห็นดูเหมือนว่าเรื่องเล็ก ๆ ที่มีเขตข้อมูล nvarchar (สูงสุด) มันก็ดูเหมือนว่าจะสำคัญว่าฉันเข้าร่วมในตารางใหญ่ด้วย guid (ซึ่งฉันเดาว่ามันต้องการใช้แฮชที่ตรงกัน)
CREATE TABLE tinytable
(
id INT PRIMARY KEY IDENTITY(1, 1),
foreignId INT NOT NULL
)
CREATE TABLE smalltable
(
id INT PRIMARY KEY IDENTITY(1, 1),
GuidId UNIQUEIDENTIFIER NOT NULL DEFAULT NEWID(),
tinyId INT NOT NULL,
Magic NVARCHAR(max) NOT NULL DEFAULT ''
)
CREATE TABLE bigtable
(
id INT PRIMARY KEY IDENTITY(1, 1),
CreatedUtc DATETIME NOT NULL DEFAULT GETUTCDATE(),
smallGuidId UNIQUEIDENTIFIER NOT NULL
)
INSERT tinytable
(foreignId)
VALUES(7)
INSERT smalltable
(tinyId)
VALUES(1)
-- make a million rows
DECLARE @i INT;
SET @i=20;
INSERT bigtable
(smallGuidId)
SELECT GuidId
FROM smalltable;
WHILE @i > 0
BEGIN
INSERT bigtable
(smallGuidId)
SELECT smallGuidId
FROM bigtable;
SET @i=@i - 1;
END
ฉันได้ทดสอบกับ SQL 2005, 2008 และ 2008R2 ด้วยผลลัพธ์เดียวกัน