у меня есть стол
id, name, date
В нем 300 миллионов строк.
Когда я бегу:
select top 100000 * from table
для запуска требуется более 30 секунд (последние версии SQL Server 2016 с 24 ядрами и 148 ГБ оперативной памяти, все флэш-рейды)
Я добавляю кластеризованный индекс на id
, запускаю тот же запрос, и он почти сразу возвращается.
Почему это быстрее с ПК? Почему SQL Server не может просто извлечь верхние N строк из файла данных и вернуть их при отсутствии индекса?
Это заставляет меня думать, что он выполняет какую-то сортировку или сортировку, но я не могу сказать, что он будет использовать.
Подробнее об этом, чтобы ответить на некоторые вопросы.
Приложение, представленное здесь, является нашим архиватором, который в основном делает это (псевдокод)
while @@rowcount <> 0
insert into z.archive
select from (delete top 100000 from dbo.maintable output deleted.*)
CHECKPOINT
Существует очень значительное улучшение скорости, связанное с наличием индекса.
У меня нет планов под рукой, но до индекса это действительно было сканирование таблицы. Но почему это медленнее, чем индекс? Учитывая отсутствие предиката, я не понимаю, почему он не просто захватывает первые N записей из файла данных и отправляет их обратно