Если оптимизатор решит, что будет более эффективно сортировать данные перед вставкой, он сделает это где-то перед оператором вставки. Если вы вводите сортировку как часть вашего запроса, оптимизатор должен понимать, что данные уже отсортированы, и не делать это снова. Обратите внимание, что выбранный план выполнения может варьироваться от запуска к запуску в зависимости от количества строк, вставленных в промежуточную таблицу.
Если вы можете фиксировать планы выполнения процесса с явной сортировкой и без нее, прикрепите их к своему вопросу для комментариев.
Изменить: 2011-10-28 17:00
Ответ @ Gonsalu, кажется, показывает, что операция сортировки всегда происходит, это не так. Требуются демонстрационные сценарии!
Поскольку сценарии становились достаточно большими, я переместил их в Gist . Для простоты экспериментов сценарии используют режим SQLCMD. Тесты проводятся на 2K5SP3, двухъядерный, 8 ГБ.
Тесты на вставку охватывают три сценария:
- Промежуточный индекс кластеризованных данных в том же порядке, что и целевой.
- Постановка данных кластерного индекса в обратном порядке.
- Промежуточные данные, сгруппированные по col2, который содержит случайный INT.
Первый запуск, вставив 25 строк.
Все три плана выполнения одинаковы, нигде в плане не происходит сортировки, и сканирование кластеризованного индекса имеет вид «order = false».
Второй запуск, вставка 26 строк.
На этот раз планы отличаются.
- Первый показывает сканирование кластеризованного индекса как order = false. Сортировка не произошла, поскольку исходные данные отсортированы надлежащим образом.
- Во втором сканируется кластерный индекс как упорядоченный = true, назад. Таким образом, у нас нет операции сортировки, но необходимость сортировки данных распознается оптимизатором, и она сканирует в обратном порядке.
- Третий показывает оператор сортировки.
Таким образом, существует переломный момент, когда оптимизатор считает, что это необходимо. Как показывает @MartinSmith, похоже, что это основано на оценочных строках, которые нужно вставить. На моем тестовом стенде 25 не требует сортировки, 26 - (2K5SP3, двухъядерный, 8 ГБ)
Сценарий SQLCMD включает переменные, которые позволяют изменять размер строк в таблице (изменение плотности страниц) и количество строк в dbo.MyTable перед дополнительными вставками. Из моих испытаний ни один не влияет на переломный момент.
Если кто-то из читателей так склонен, пожалуйста, запустите сценарии и добавьте свой переломный момент в качестве комментария. Интересно узнать, меняется ли он в зависимости от тестовых установок и / или версий.
Изменить: 2011-10-28 20:15
Повторные испытания на той же установке, но с 2K8R2. На этот раз переломный момент составляет 251 ряд. Опять же, изменение плотности страниц и количества существующих строк не имеет никакого эффекта.