ORDER BYПункт в SELECTзаяві є зайвим.
Це зайве, оскільки рядки, які будуть вставлені, якщо їх потрібно буде сортувати , у будь-якому разі сортуються.
Створимо тестовий випадок.
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;
Давайте включимо відображення тексту фактичних планів запитів, щоб ми могли бачити, які завдання виконує процесор запитів.
SET STATISTICS PROFILE ON;
GO
Тепер давайте INSERT2К рядків у таблицю без ORDER BYзастереження.
INSERT INTO #Test
SELECT number
FROM #Sequence
Фактичний план виконання цього запиту наступний.
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]))
Як бачите, оператор Сортування перед тим, як відбудеться власне ВСТАВКА.
Тепер давайте очистимо таблицю, і INSERT2k рядків у таблицю з ORDER BYпунктом.
TRUNCATE TABLE #Test;
GO
INSERT INTO #Test
SELECT number
FROM #Sequence
ORDER BY number
Фактичний план виконання цього запиту наступний.
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]))
Зауважте, що це той самий план виконання, який був використаний для INSERTоператора без ORDER BYпункту.
Тепер Sortоперація не завжди потрібно, оскільки Марк Сміт показав в інший відповідь (якщо число рядків , які будуть вставлені низький), але ORDER BYстановище по - , як і раніше зайвим в цьому випадку, тому що навіть з явним ORDER BY, ні одна Sortоперація не генерується процесором запитів.
Ви можете оптимізувати INSERTвислів у таблицю з кластерним індексом, використовуючи мінімально занесений журнал INSERT, але це не вдається для цього питання.
Оновлено 2011-11-02: Як показав Марк Сміт , INSERTs в таблиці з кластеризованим індексом не завжди може бути потрібна сортування - ORDER BYоднак ця пропозиція також є зайвою у цьому випадку.