В последнее время я читал о том, как работают clustered index
и non-clustered index
. Мое понимание простыми словами (поправьте меня, если не так):
Структура данных, которая поддерживает clustered
и non-clustered index
, равна B-Tree
Clustered Index
: физически сортирует данные на основе столбца (или ключа) индекса. у вас может быть только один clustered Index
на table
. Если во время создания таблицы не указано index
, сервер SQL
автоматически создаст clustered Index
на primary key column
.
Q1. Поскольку данные физически сортируются на основе индекса, здесь не требуется дополнительного места. это правильно? так что же происходит, когда я отбрасываю созданный мной индекс?
Non-clustered Index
: В non-clustered indexes
leaf-node
дерева содержит значения столбцов и указатель (указатель строки) на фактическую строку в базе данных. Здесь требуется дополнительное пространство для хранения этого non-clustered index table
физически на диске. Однако количество non-clustered Indexes.
не ограничивается
Q2. Означает ли это, что запрос столбца некластеризованного индекса не приведет к отсортированным данным?
Q3. Здесь связан дополнительный поиск, позволяющий найти фактические данные строки с помощью указателя на листовом узле. Насколько сильно это будет отличаться в производительности по сравнению с кластеризованным индексом?
Упражнение:
рассмотрим таблицу сотрудников:
CREATE TABLE Employee
(
PersonID int PRIMARY KEY,
Name varchar(255),
age int,
salary int
);
Теперь я создал таблицу сотрудников (создается кластерный индекс по сотруднику по умолчанию).
Два частых запроса к этой таблице выполняются только по столбцам "Возраст" и "Зарплата". Для простоты предположим, что таблица НЕ часто обновляется.
Например:
select * from employee where age > XXX;
select * from employee where salary > XXXX and salary < YYYY;
Q4: как лучше всего построить индексы, чтобы запросы к обоим этим столбцам имели одинаковую производительность. Если у меня есть кластерный индекс по возрасту, запросы по столбцу возраста будут быстрее, но по столбцу зарплаты будут медленнее.
Q5: по теме: я неоднократно видел, что индексы (как кластерные, так и некластеризованные) должны создаваться для столбцов с уникальными ограничениями. это почему? что произойдет, если этого не сделать?
Большое спасибо. Сообщения, которые я прочитал, находятся здесь:
http://msdn.microsoft.com/en-us/library/ms190457.aspx
Кластеризованный против некластеризованного
Что на самом деле означают кластерный и некластеризованный индекс?
В чем различия между кластеризованным и некластеризованным индексом?