В чем разница между кластерными и некластерными индексами
Что проверяют
Понимаете ли вы, что кластерный индекс задаёт физический порядок строк, и знаете ли следствия для вставки и для остальных индексов.
Как отвечать
Кластерный индекс определяет порядок хранения самих строк. Данные лежат в его листьях, поэтому поиск по ключу не требует второго обращения, а диапазонный запрос читает подряд идущие страницы. Он один: двух физических порядков у таблицы быть не может. В SQL Server создаётся по первичному ключу по умолчанию.
Некластерный это отдельная структура, где в листьях лежит ключ индекса и ссылка на строку. Их может быть много. После поиска в индексе обычно нужен переход к самой строке, и если таких переходов много, планировщик предпочтёт просмотр таблицы целиком. Избежать перехода помогает покрывающий индекс с INCLUDE.
Практические следствия, ради которых вопрос и задают:
- кластерный ключ должен быть узким и возрастающим. Ссылка на строку в каждом некластерном индексе это и есть кластерный ключ, поэтому широкий ключ раздувает все индексы сразу;
- случайный ключ вроде GUID вызывает расщепление страниц и фрагментацию при вставке. Отсюда практика брать возрастающий идентификатор;
- кластерный индекс не бесплатен: изменение его ключа означает физическое перемещение строки.
Стоит добавить, что в PostgreSQL такого понятия нет: все индексы вторичные, а команда CLUSTER это разовая перестройка, которая не поддерживается автоматически.
Где спотыкаются
Считают, что кластерных индексов может быть несколько.
Не знают, что некластерный индекс хранит внутри кластерный ключ.
Берут GUID кластерным ключом.
Переносят термин на PostgreSQL, где он означает другое.