Dengan gabungan tiga tabel sederhana, kinerja permintaan berubah secara drastis saat ORDER BY disertakan bahkan tanpa baris yang dikembalikan. Skenario masalah aktual membutuhkan waktu 30 detik untuk mengembalikan nol baris tetapi instan saat ORDER BY tidak disertakan. Mengapa?
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 */
Saya mengerti bahwa saya bisa memiliki indeks pada bigtable.smallGuidId, tapi, saya percaya itu akan membuat lebih buruk dalam kasus ini.
Berikut skrip untuk membuat / mengisi tabel untuk pengujian. Anehnya, tampaknya penting bahwa smalltable memiliki bidang nvarchar (max). Tampaknya juga penting bahwa saya bergabung di bigtable dengan guid (yang saya kira membuatnya ingin menggunakan pencocokan hash).
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
Saya sudah menguji SQL 2005, 2008 dan 2008R2 dengan hasil yang sama.
sumber