Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Индексы SQL Server: composite или include  [new]
roman_lenko
Member

Откуда: Киев
Сообщений: 98
Всем привет!

Прошу дать ответ на вопрос, который меня уже конкретно замучал, т.к. я неоднократно пытаюсь найти на него правильный ответ. Верны ли 2 следующих утверждения:

1) Составные (composite) индексы нужно использовать когда поиск осуществляется по всем полям состоящим в индексе.

Например:

-- Типа, таблица пользователей.
create table dbo.Users(

    -- ID пользователя.
    id int not null,

    -- Логин.
    login varchar(32),

    -- Пароль.
    password varchar(32)
);

-- Это составной индекс.
create nonclustered index LoginPassword on dbo.Users(login, password);

-- А этот запрос будет выполняться эффективно, благодаря индексу описанному выше.
select id from dbo.Users where login = 'vasya' and password = 'qwerty12345';


2) Включённые (included) индексы должны использоваться когда поиск осуществляется только по полю указанном в индексе, а поле, которое included, присутствует в полях, которые извлекаются из базы данных.

Например:

-- Типа, таблица городов.
create table dbo.Cities(

    -- Имя города.
    name varchar(32),

    -- Имя страны (в которой город расположен).
    country varchar(32)
);

-- Это индекс с включённым (included) полем.
create nonclustered index Name on dbo.Cities(name) include(country);

-- А этот запрос будет выполняться эффективно, благодаря индексу описанному выше.
select country from dbo.Cities where city = 'Paris';


Верны ли мои утверждения?

Спасибо!

P.S. На эту тему я уже гугли-перегуглил, но, такое впечатление, что автора статей и постов сами не до конца в курсе какой и когда тип индекса нужно использовать.
19 окт 13, 16:36    [15002360]     Ответить | Цитировать Сообщить модератору
 Re: Индексы SQL Server: composite или include  [new]
roman_lenko
Member

Откуда: Киев
Сообщений: 98
Кстати, да — а может тогда нужно в первом примере индекс вообще вот так организовать? — id же, типа, присутствует среди извлекаемых полей.

create nonclustered index LoginPassword on dbo.Users(login, password) include(id);
19 окт 13, 16:39    [15002362]     Ответить | Цитировать Сообщить модератору
 Re: Индексы SQL Server: composite или include  [new]
kalimba
Member

Откуда:
Сообщений: 297
roman_lenko,

Всё верно, только во втором примере
where name = 'Paris'
Включать столбец в первом случае не надо, если у вас id будет clustered primary key (что скорее всего будет так). Если поле id не будет в кластерном индексе (или его самого вообще не будет), то тогда надо.
19 окт 13, 17:54    [15002476]     Ответить | Цитировать Сообщить модератору
 Re: Индексы SQL Server: composite или include  [new]
roman_lenko
Member

Откуда: Киев
Сообщений: 98
Большое спасибо — наконец, уяснил.

Кроме шуток — если у кого-то есть технический блог, в нём можно поместить информацию на текущую тему об организации индексов — будет реально, что называют сеошники, «уникальный контент» — я нигде не нашел в интере нормального внятного объяснения.
20 окт 13, 11:44    [15004046]     Ответить | Цитировать Сообщить модератору
 Re: Индексы SQL Server: composite или include  [new]
kalimba
Member

Откуда:
Сообщений: 297
roman_lenko,

Вот здесь посмотрите две части доклада "Индексы и все, все, все", я думаю станет лучше понятней)
http://russianvc.sqlpass.org/Архиввстреч.aspx
20 окт 13, 12:27    [15004142]     Ответить | Цитировать Сообщить модератору
 Re: Индексы SQL Server: composite или include  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
roman_lenko
Большое спасибо — наконец, уяснил.

Кроме шуток — если у кого-то есть технический блог, в нём можно поместить информацию на текущую тему об организации индексов — будет реально, что называют сеошники, «уникальный контент» — я нигде не нашел в интере нормального внятного объяснения.


на самом деле, особой разницы между обычным покрывающим индексом и покрывающим индексом с included columns - нету
т.е. таки да, разница есть, её можно замерить и всё такое - но никаких особых плюшек по перформансу или по экономии дискового пространства в типовых системах - не будет

Единственное радикальное, так сказать, отличие индекса с included columns - это возможность преобразования уникального индекса в покрывающий, без излишних телодвижений.
20 окт 13, 12:57    [15004207]     Ответить | Цитировать Сообщить модератору
 Re: Индексы SQL Server: composite или include  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3274
roman_lenko,

Помимо указанного locky, еще одно значительное отличие - возможность преодоления лимита в 900 байт на ширину индекса (включаемые поля в этом случае не учитываются). Но в обычных OLTP-системах это не актуально.
20 окт 13, 15:58    [15004570]     Ответить | Цитировать Сообщить модератору
 Re: Индексы SQL Server: composite или include  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Ennor Tiegael
roman_lenko,

Помимо указанного locky, еще одно значительное отличие - возможность преодоления лимита в 900 байт на ширину индекса (включаемые поля в этом случае не учитываются). Но в обычных OLTP-системах это не актуально.


900 байт на ключевую часть индекса - это очень много
учитывая, что в ключевой части не может быть более 16 столбцов - выходит по 56 байт на столбец
GUID -16 , decimal - 17, int -4, bigint-8
выходит, что для упирания в барьер из 900 байт нужно применять ключевые поля строкового типа
как правило в таких случаях применяют немного другие техники
900 байт - это даже для строки данных - очень и очень много, это всего 8 строк на страницу данных.
а для индекса - так вообще уж чересчур

ну и сам факт - индекс на 16 столбцов - это, скажем так, слишком забавно, какие-то особо специфические случаи для OLTP

так что я этим аргументов/"достоинством" всегда пренебрегаю.
20 окт 13, 16:24    [15004635]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить