ORDER BYİçinde fıkra SELECTaçıklamada gereksiz olduğunu.
Gereksizdir, çünkü eklenecek satırlar, sıralanmaları gerekiyorsa , yine de sıralanırlar.
Bir test davası oluşturalım.
CREATE TABLE #Test (
id INTEGER NOT NULL
);
CREATE UNIQUE CLUSTERED INDEX CL_Test_ID ON #Test (id);
CREATE TABLE #Sequence (
number INTEGER NOT NULL
);
INSERT INTO #Sequence
SELECT number FROM master..spt_values WHERE name IS NULL;
Gerçek sorgu planlarının metin gösterimini etkinleştirelim, böylece sorgu işlemcisi tarafından hangi görevlerin gerçekleştirildiğini görebiliriz.
SET STATISTICS PROFILE ON;
GO
Şimdi, INSERT2K ORDER BYyan tümce tümce tümce tümce olmadan olsun .
INSERT INTO #Test
SELECT number
FROM #Sequence
Bu sorgu için gerçek yürütme planı şudur.
INSERT INTO #Test SELECT number FROM #Sequence
|--Clustered Index Insert(OBJECT:([tempdb].[dbo].[#Test]), SET:([tempdb].[dbo].[#Test].[id] = [tempdb].[dbo].[#Sequence].[number]))
|--Top(ROWCOUNT est 0)
|--Sort(ORDER BY:([tempdb].[dbo].[#Sequence].[number] ASC))
|--Table Scan(OBJECT:([tempdb].[dbo].[#Sequence]))
Gördüğünüz gibi, asıl INSERT gerçekleşmeden önce bir Sıralama işleci var.
Şimdi, tabloyu temizleyelim ve INSERT2k cümlesiyle birlikte tabloya satırları ORDER BYsokalım.
TRUNCATE TABLE #Test;
GO
INSERT INTO #Test
SELECT number
FROM #Sequence
ORDER BY number
Bu sorgu için gerçek yürütme planı şudur.
INSERT INTO #Test SELECT number FROM #Sequence ORDER BY number
|--Clustered Index Insert(OBJECT:([tempdb].[dbo].[#Test]), SET:([tempdb].[dbo].[#Test].[id] = [tempdb].[dbo].[#Sequence].[number]))
|--Top(ROWCOUNT est 0)
|--Sort(ORDER BY:([tempdb].[dbo].[#Sequence].[number] ASC))
|--Table Scan(OBJECT:([tempdb].[dbo].[#Sequence]))
Bu INSERTcümle olmadan ifade için kullanılan aynı uygulama planı olduğuna dikkat edin ORDER BY.
Şimdi, Mark Smith başka bir cevapta gösterdiği için Sortişlem her zaman gerekli değildir (eğer eklenecek satır sayısı düşükse), ancak bu durumda fıkra hala gereksizdir, çünkü açık bir şekilde bile , hiçbir işlem yapılmaz. sorgu işlemcisi tarafından.ORDER BYORDER BYSort
INSERTMinimal olarak günlüğe kaydedilen kullanarak, bir ifadeyi kümelenmiş bir dizini içeren bir tabloya göre optimize edebilirsiniz INSERT, ancak bu sorunun kapsamı dışındadır.
Updated 2011-11-02: Mark Smith'in gösterdiği gibi , INSERTkümelenmiş bir dizine sahip bir tabloya her zaman sıralanması gerekmeyebilir - ORDER BYfıkra da bu durumda gereksizdir.