Почему кластерный индекс ускоряется Выберите вверх - PullRequest
0 голосов
/ 03 июля 2018

у меня есть стол

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 записей из файла данных и отправляет их обратно

1 Ответ

0 голосов
/ 04 июля 2018

В таблице с 300 миллионами строк, я предполагаю, что у вас очевидно много фрагментации в таблице.

Создание кластеризованного индекса устранит фрагментацию, сократит количество страниц, которые нужно прочитать, и отсортирует их, чтобы оптимизатор запросов мог выполнять поиск вместо сканирования таблицы. Разница будет заключаться в количестве операций чтения, необходимых SQL Server, чтобы получить количество строк, запрошенных для

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...