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

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

Помогите в оптимальном создании индексов для таблицы.

Например, есть некая упрощённая таблица:

create table Users(
  id int,
  name varchar(32),
  cityId int,
  positionId int,
  officeId int
);


К этой таблице могут выполняться, в основом, 2 типа запросов:

select id, name fomr Users where cityId = X and positionId = Y;
select id, name fomr Users where cityId = X and officeId = Y;


Т.е., в обоих типах запросов полюбому присутствует обращение к колонке cityId, а вторая колонка меняется(positionId, или officeId). Как оптимально организовать индексы для оптимизации указанных мною типов запросов?

Мой вариант:

create nonclustered index CityPosition on Users(cityId, positionId);
create nonclustered index CityOffice on Users(cityId, officeId);


Что скажете? - не ухудшит ли это выполнение условий типа select id, name from Users where cityId = X and positionId = Y and officeId = Z; которые редкие, но всё-же будут иногда использоваться? И вообще - правильно ли я предлагаю создать индексы?

Спасибо!
12 май 13, 14:01    [14283700]     Ответить | Цитировать Сообщить модератору
 Re: Правильная организация индексов при условии AND  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
добавьте в оба индекса
...include (id, name)
12 май 13, 14:17    [14283727]     Ответить | Цитировать Сообщить модератору
 Re: Правильная организация индексов при условии AND  [new]
roman_lenko
Member

Откуда: Киев
Сообщений: 98
Knyazev Alexey
добавьте в оба индекса
...include (id, name)


А для чего это? А если колонок больше чем 2(id, name), например, id, name, age, gender и др.? - не скажется ли это негативно.

Кстати, хочу сразу уточнить, что колонка id НЕ является ни primary, ни foreign key и выборка по ней никогда не производится.
12 май 13, 14:21    [14283737]     Ответить | Цитировать Сообщить модератору
 Re: Правильная организация индексов при условии AND  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
roman_lenko
Кстати, хочу сразу уточнить, что колонка id НЕ является ни primary, ни foreign key и выборка по ней никогда не производится.

ну вот, как раз потому, что это поле не учувствует в выборках, то оно не нужно в составе самого индекса, а вот, чтоб не делать поиск по RID-у тех полей, которых нет в индексе их желательно включить на листовом уровне, чтоб он был покрывающим
12 май 13, 14:25    [14283745]     Ответить | Цитировать Сообщить модератору
 Re: Правильная организация индексов при условии AND  [new]
roman_lenko
Member

Откуда: Киев
Сообщений: 98
:O понял.

Т.е., делаю так?

create nonclustered index CityPosition on Users(cityId, positionId) include(id, name, age, gender);
create nonclustered index CityOffice on Users(cityId, officeId) include(id, name, age, gender);
12 май 13, 14:28    [14283753]     Ответить | Цитировать Сообщить модератору
 Re: Правильная организация индексов при условии AND  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
roman_lenko
:O понял.

Т.е., делаю так?

create nonclustered index CityPosition on Users(cityId, positionId) include(id, name, age, gender);
create nonclustered index CityOffice on Users(cityId, officeId) include(id, name, age, gender);

а поля age, gender зачем?

если в вашем же первом сообщении:

автор
К этой таблице могут выполняться, в основом, 2 типа запросов:
select id, name fomr Users where cityId = X and positionId = Y;
select id, name fomr Users where cityId = X and officeId = Y;

12 май 13, 14:43    [14283780]     Ответить | Цитировать Сообщить модератору
 Re: Правильная организация индексов при условии AND  [new]
roman_lenko
Member

Откуда: Киев
Сообщений: 98
а поля age, gender зачем?


Ну, это я не уточнил. Допустим, если я выполняю запросы

select id, name, age, gender from Users where cityId = X and positionId = Y;
select id, name, age, gender from Users where cityId = X and officeId = Y;


то поля age и gender тоже нужно включать в include?
12 май 13, 15:02    [14283817]     Ответить | Цитировать Сообщить модератору
 Re: Правильная организация индексов при условии AND  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
roman_lenko
то поля age и gender тоже нужно включать в include?

вам нужно оценить в целом, сколько и каких запросов...т.к. на поддержание индексов нужно тоже достаточно накладных расходов
в любом случаи под 100% запросов вам индексов не создать, если конечно у вас не рид-онли система
12 май 13, 15:05    [14283822]     Ответить | Цитировать Сообщить модератору
 Re: Правильная организация индексов при условии AND  [new]
Exproment
Member

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

1. Почему у вас поле id не является кластеризованным индексом ?
2. В первую очередь действительно, следует определить основную массу запросов, которые будут обращаться к таблице. только так можно будет адекватно понять, какие поля будут ключевыми, какие include.
12 май 13, 16:00    [14283965]     Ответить | Цитировать Сообщить модератору
 Re: Правильная организация индексов при условии AND  [new]
Exproment
Member

Откуда:
Сообщений: 416
Exproment, если у вас много полей в результирующих наборах и данные часто меняются, то скорее всего невыгодно будет под каждый запрос строить покрывающий индекс и лучше будет выполнять поиск по узкому мндексу, а получать результат из кластеризованного индекса.
12 май 13, 16:04    [14283968]     Ответить | Цитировать Сообщить модератору
 Re: Правильная организация индексов при условии AND  [new]
AnyKey45
Member

Откуда: Ekaterinburg-Moscow-EU
Сообщений: 219
если cityId в каждом запросе - может быть по нему сделать кластеризованный тогда?
13 май 13, 07:19    [14285610]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить