В чем разница между кластеризованными и некластеризованными индексами в Microsoft SQL Server?
Выбор правильного типа индекса для ваших нужд означает, что ваша база данных будет работать более эффективно.
Индекс помогает SQL Server быстро извлекать данные из строк. Индексы работают как оглавление в начале книги, позволяя быстро найти страницу, на которой находится тема. Без индексов SQL Server приходится сканировать все строки таблицы, чтобы найти запись.
В SQL Server существует два типа индексов: кластерные и некластеризованные. Узнайте разницу между кластеризованными и некластеризованными индексами и почему они важны.
Кластерный индекс в SQL Server
В кластеризованном индексе строки данных физически хранятся в упорядоченном виде на основе значения ключа. Поскольку индекс включает в себя таблицу и он может располагать строки только в одном порядке, вы можете создать только один кластерный индекс для каждой таблицы.
Хотя индексы ускоряют извлечение строк в диапазоне, инструкции INSERT и UPDATE могут работать медленно, поскольку оптимизатор запросов сканирует индекс по порядку, пока не найдет целевой индекс.
Некластеризованный индекс в SQL Server
Некластеризованный индекс содержит ключевые значения, записью которых является указатель, называемый локатором строк. Для кластеризованных таблиц (таблиц с кластеризованным индексом) указатель указывает на ключ в кластеризованном индексе, который, в свою очередь, указывает на строку в таблице. Для строк без кластерного индекса указатель указывает непосредственно на строку таблицы.
Как создать кластерный индекс в SQL Server
Когда вы создаете таблицу с первичным ключом, SQL Server автоматически создает ключ кластерного индекса на основе этого первичного ключа. Если у вас нет первичного ключа, вы можете выполнить следующую инструкцию, чтобы создать ключ кластерного индекса.
CREATE CLUSTERED INDEX <index name>
ON TABLE <table_name>(column_name)
В этом операторе вы указываете имя индекса, имя таблицы, в которой его нужно создать, и имя столбца, который будет использоваться в индексе.
Если вы добавите первичный ключ в таблицу, которая уже имеет кластерный индекс, SQL Server создаст с его помощью некластеризованный индекс.
Чтобы создать кластеризованный индекс, не включающий столбец первичного ключа, необходимо сначала удалить ограничение первичного ключа.
USE database_name
ALTER TABLE table_name
DROP CONSTRAINT pk_name
GO
Удаление ограничений первичного ключа также удаляет кластеризованный индекс, позволяя вам создать собственный.
Как создать некластеризованный индекс в SQL Server
Чтобы создать некластеризованный индекс, используйте следующий оператор.
CREATE INDEX <index name>
ON TABLE <table_name>(column_name)
Вы также можете использовать ключевое слово NONCLUSTERED следующим образом:
CREATE [NONCLUSTERED] INDEX <index name>
ON TABLE <table_name>(column_name)
Этот оператор создает некластеризованный индекс в указанной вами таблице и включает указанный столбец.
При желании вы можете отсортировать столбцы по возрастанию (ASC) или убыванию (DESC).
CREATE [NONCLUSTERED] INDEX <index name>
ON TABLE <table_name>(column_name ASC/DESC)
Какой индекс выбрать?
Как кластеризованные, так и некластеризованные индексы сокращают время выполнения запросов. Если большинство ваших запросов представляют собой операции SELECT для нескольких столбцов таблицы, кластеризованные индексы работают быстрее. Однако для операций INSERT или UPDATE некластеризованные индексы работают быстрее, поскольку оптимизатор запросов может найти столбец непосредственно из индекса.
Как видите, эти индексы лучше всего работают для разных SQL-запросов. Поэтому большинству баз данных SQL будет полезно иметь хотя бы один кластерный индекс и некластеризованные индексы для регулярно обновляемых столбцов.
Важность индексов в SQL Server
Кластеризованные и некластеризованные индексы повышают производительность запросов. Когда вы запускаете запрос, оптимизатор запросов сканирует индекс в поисках места хранения строки, а затем извлекает информацию из этого места. Это намного быстрее, чем сканирование всех строк таблицы.
Вы также можете использовать некластеризованные индексы для разрешения взаимоблокировок при поиске закладок, создавая некластеризованный индекс для столбцов, к которым обращаются запросы.