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
Тепер давайте INSERT
2К рядків у таблицю без 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]))
Як бачите, оператор Сортування перед тим, як відбудеться власне ВСТАВКА.
Тепер давайте очистимо таблицю, і INSERT
2k рядків у таблицю з 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: Як показав Марк Сміт , INSERT
s в таблиці з кластеризованим індексом не завжди може бути потрібна сортування - ORDER BY
однак ця пропозиція також є зайвою у цьому випадку.