Действительно, у кластерных индексов есть и недостатки.
Я думаю, что наиболее недооцененным недостатком является то, что я называю штрафом за кластеризованный индекс.
Если у вас нет какого-либо кластеризованного индекса для таблицы, это означает, что таблица хранится как таблица в куче. Все некластеризованные индексы ссылаются на эту таблицу кучи.
Преимущество таблиц с кучей заключается в том, что строки, хранящиеся в них, почти никогда не перемещаются — в отличие от кластеризованных индексов, в которых каждая строка может в любое время перемещаться в другое физическое место.
Это различие влияет на некластеризованные индексы, поскольку они ссылаются на строки в куче или кластерном индексе: в случае кучи они могут просто хранить физическое расположение этой строки в некластеризованных индексах (поскольку они почти никогда не меняются). При наличии кластеризованного индекса некластеризованные индексы хранят ключ кластеризации.
Если вы в конечном итоге используете некластеризованный индекс, усилия по доступу к фактической таблице в куче или в кластерном индексе сильно различаются: с кучей вам просто нужен один физический ввод-вывод, с кластеризованным индексом вам нужно сделать Кластерный поиск по индексу, который обычно составляет 3–5 логических операций ввода-вывода (в зависимости от размера таблицы).
Если у вас много некластеризованных индексов и вы используете их без сканирования только индекса (это означает, что следует доступ к RID), кластеризованный индекс может значительно снизить производительность.
Подробнее об этом в этой статье я писал:
http://use-the-index-luke.com/blog/2014-01/unreasonable-defaults-primary-key-clustering-key
person
Markus Winand
schedule
24.11.2017
create table foo (id integer primary key nonclustered)
- person a_horse_with_no_name   schedule 24.11.2017