В таблице без кластерного индекса (таблица "кучи"), страницы данных не соединены - настолько пересекающие страницы требуют поиск в Карту распределения индексов .
, которую имеет кластеризованная таблица, однако, это страницы данных, связанные в двунаправленном связанном списке - создание последовательных сканирований немного быстрее. Конечно, в обмен, у Вас есть издержки контакта с поддержанием в порядке страниц данных на INSERT
, UPDATE
, и DELETE
. Таблица "кучи", однако, требует, чтобы вторая запись ко мне БЫЛА.
, Если Ваш запрос имеет RANGE
оператор (например: SELECT * FROM TABLE WHERE Id BETWEEN 1 AND 100
), затем кластеризованная таблица (находиться в гарантируемом порядке) была бы более эффективной - поскольку она могла использовать индексные страницы для нахождения соответствующей страницы (страниц) данных. "Куча" должна была бы просканировать все строки, так как она не может полагаться на упорядочивание.
И, конечно, кластерный индекс позволяет Вам сделать, КЛАСТЕРНЫЙ ИНДЕКС ИЩЕТ, который в значительной степени оптимален для производительности..., "куча" без индексов всегда приводила бы к сканированию таблицы.
Так:
Для Вашего примера запрашивают, где Вы выбираете все строки, единственной разницей является двунаправленный связанный список, который поддерживает кластерный индекс. Это должно сделать Вашу кластеризованную таблицу просто крошечным битом быстрее, чем "куча" с большим количеством строк.
Для запроса с WHERE
пункт, который может быть (по крайней мере, частично) удовлетворен кластерным индексом, Вы выйдете вперед из-за упорядочивания - таким образом, Вы не должны будете сканировать всю таблицу.
Для запроса, который не является satisified кластерным индексом, Вы в значительной степени даже... снова, единственная разница, являющаяся тем двунаправленным связанным списком для последовательного сканирования. В любом случае Вы являетесь субоптимальными.
Для INSERT
, UPDATE
, и DELETE
"куча" может или не может победить. "Куча" не должна поддерживать порядок, но действительно требует, чтобы вторая запись ко мне БЫЛА. Я думаю, что относительное различие в производительности было бы незначительно, но также и довольно информационно-зависимо.
Microsoft имеет техническое описание , который сравнивает кластерный индекс с эквивалентным некластерным индексом на "куче" (не точно то же, как я обсудил выше, но близко). Их заключение состоит в том, чтобы в основном поместить кластерный индекс на все таблицы. Я приложу все усилия для суммирования их результатов (снова, обратите внимание, что они действительно сравнивают некластерный индекс с кластерным индексом здесь - но я думаю, что это относительно сопоставимо):
INSERT
производительность: кластерный индекс побеждает приблизительно на 3% из-за второй записи, необходимой для "кучи". UPDATE
производительность: кластерный индекс побеждает приблизительно на 8% из-за второго поиска, необходимого для "кучи". DELETE
производительность: победы кластерного индекса приблизительно на 18% из-за второго необходимого поиска и второе удаляют необходимый из меня, для "кучи". SELECT
производительность: кластерный индекс побеждает приблизительно на 16% из-за второго поиска, необходимого для "кучи". SELECT
производительность: кластерный индекс побеждает приблизительно на 29% из-за случайного упорядочивания для "кучи". INSERT
: таблица "кучи" побеждает на 30% при загрузке из-за расщеплений страницы для кластерного индекса. Похоже, что отправка сигнала HUP ведущему Unicorn является лучшей альтернативой, если preload_app
- false
.
Из http://unicorn.bogomips.org/SIGNALS.html :
HUP - перезагружает конфигурационный файл и корректно перезапускает всех рабочих. Если директива preload_app имеет значение false (по умолчанию), то при перезапуске работники также поймут любые изменения кода приложения.