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

Откуда:
Сообщений: 244
Коллеги, как правильно (для оптимального поиска) сделать индекс на таблице многие ко многим?

Допустим есть таблица table( id1 uniqueidentifier, id2 uniqueidentifier )

Поиск может вестись, как по одному полю (id1 или id2), так и по обоим сразу.

1. Стоит ли добавить ещё идентификатор записи и индексы как-то связывать с ним?
2. Сделать два индекса, один для id1, другой для id2, каждый из них включает другой столбец?


3. А что посоветуте по такой таблице table( id_parent_1 uniqueidentifier, id_child_1 uniqueidentifier, id_parent_2 uniqueidentifier, id_child_2 uniqueidentifier)
Здесь связываются два элемента (тоже м:м), но один элемент определяется двумя GUIDами.
?
7 мар 13, 09:53    [14023247]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно делать индексы на таблице многие ко многим?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
super-code
?


Сравнить планы выполнения запросов без индексов и с ними. Сделать вывод.
7 мар 13, 09:54    [14023253]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно делать индексы на таблице многие ко многим?  [new]
super-code
Member

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

Сравнить без проблем (то есть с этим тоже я ещё на "вы", но это другой вопрос). Только сравнивать нечего, пока ничего не создано.
7 мар 13, 10:10    [14023320]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно делать индексы на таблице многие ко многим?  [new]
super-code
Member

Откуда:
Сообщений: 244
Вот и спрашиваю, что создать, чтобы потом проверить.
7 мар 13, 10:10    [14023323]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно делать индексы на таблице многие ко многим?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
super-code
Вот и спрашиваю, что создать, чтобы потом проверить.


Сами поэкспериментировать не хотите? С разными вариантами создания индексов, анализируя при этом планы и статистику выполнения запросов.

Сообщение было отредактировано: 7 мар 13, 10:20
7 мар 13, 10:13    [14023342]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно делать индексы на таблице многие ко многим?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
super-code
Поиск может вестись, как по одному полю (id1 или id2), так и по обоим сразу.

Если поиск идёт по некоему полю, то нужен индекс, где это поле будет первым ключевым (а зачастую — и единственным ключевым).

Тогда вырисовываются такие варианты для id1:
1) Индекс по id1;
2) Индекс по (id1, id2);
3) Индекс по id1 include (id2).

И такие варианты для id2:
А) Индекс по id2;
Б) Индекс по (id2, id1);
В) Индекс по id2 include (id1).

Собственно, комбинируете любой "цифровой" вариант с любым "буквенным" — и из этого выбираете, т.е. из 9 комбинаций.
7 мар 13, 10:31    [14023435]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно делать индексы на таблице многие ко многим?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Кстати, индекс по id1, id2 (также как по id2, id1) можно сделать уникальным — будет контроль против дублирования записей в таблице-связке.
7 мар 13, 10:40    [14023478]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно делать индексы на таблице многие ко многим?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Гость333
Кстати, индекс по id1, id2 (также как по id2, id1) можно сделать уникальным — будет контроль против дублирования записей в таблице-связке.


Это должен быть PK, IMHO.
7 мар 13, 10:42    [14023487]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно делать индексы на таблице многие ко многим?  [new]
super-code
Member

Откуда:
Сообщений: 244
Мой успех рецепта:
Добавить новое поле identity, по нему кластерный индекс. + два некластерных индекса, не включающие другие поля. (по одному на каждое поле).
7 мар 13, 13:03    [14024251]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно делать индексы на таблице многие ко многим?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
super-code
успех рецепта

Хорошо сказал :-)
7 мар 13, 13:08    [14024280]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно делать индексы на таблице многие ко многим?  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
super-code
Мой успех рецепта:
Добавить новое поле identity, по нему кластерный индекс. + два некластерных индекса, не включающие другие поля. (по одному на каждое поле).

А вот это зачем
super-code
новое поле identity, по нему кластерный индекс
? я часто встречал такой способ реализации в базах с котороыми сталкивался, зачем так делают? ведь не несет никакого смысла "новое поле identity" и лишь добавляет лишний объем данных и лишний индекс. А практического смысла нет. Не учавствует ни в каких запросах, просто как мертвому припарка.
7 мар 13, 13:28    [14024361]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно делать индексы на таблице многие ко многим?  [new]
Kanadec
Member

Откуда: Moscow
Сообщений: 43
ambarka_max
super-code
Мой успех рецепта:
Добавить новое поле identity, по нему кластерный индекс. + два некластерных индекса, не включающие другие поля. (по одному на каждое поле).

А вот это зачем
super-code
новое поле identity, по нему кластерный индекс
? я часто встречал такой способ реализации в базах с котороыми сталкивался, зачем так делают? ведь не несет никакого смысла "новое поле identity" и лишь добавляет лишний объем данных и лишний индекс. А практического смысла нет. Не учавствует ни в каких запросах, просто как мертвому припарка.


Ну это как сказать. Можно хорошо нарваться на Page Split-ы, если в таблицу будут идти вставки в кластерный индекс неупорядоченно. Так как кластерный индекс хранит в себе данные упорядоченно, то SQL Server-у придется каждый раз упорядочивать данные на листовом уровне индекса для новых записей.
А в данном случае, если будет кластерный индекс по Identity, то не должно быть Page Split(на листовом уровне) при инсертах, так как значение, вставляемое в кластерник, монотонно возрастает.
7 мар 13, 13:48    [14024450]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно делать индексы на таблице многие ко многим?  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33976
Блог
Kanadec,

в таком случае может просто... не создавать кластерный индекс? )
7 мар 13, 13:53    [14024471]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно делать индексы на таблице многие ко многим?  [new]
Kanadec
Member

Откуда: Moscow
Сообщений: 43
super-code
Мой успех рецепта:
Добавить новое поле identity, по нему кластерный индекс. + два некластерных индекса, не включающие другие поля. (по одному на каждое поле).


Рецепт рабочий, но не всегда наилучший. Это зависит от запросов. :)
Иногда лучше использовать 1 составной индекс, нежели 2 НЕсоставных индекса. Это избавит от Key lookup-ов для запросов, которые используют 2 поля в условии Where.
7 мар 13, 13:54    [14024476]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно делать индексы на таблице многие ко многим?  [new]
Kanadec
Member

Откуда: Moscow
Сообщений: 43
Критик,

Ага. В таком случае можно и не создавать. :)
7 мар 13, 13:55    [14024485]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно делать индексы на таблице многие ко многим?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Kanadec
Можно хорошо нарваться на Page Split-ы, если в таблицу будут идти вставки в кластерный индекс неупорядоченно.

В данном случае будет куча сплитов по обычным индексам...
7 мар 13, 13:58    [14024496]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно делать индексы на таблице многие ко многим?  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
super-code
Мой успех рецепта:
Добавить новое поле identity, по нему кластерный индекс. + два некластерных индекса, не включающие другие поля. (по одному на каждое поле).
Новое поле identity с кластерным индексом по нему не несет никакого смысла, только что увеличивает размер занимаемый таблицей в 1.75-2.25 раза. Ну и плюс замедляет операции обновления, без каких либо бенефитов взмен.

Делать индекс по одиночному полю (не включая второе) весьма глупо, ибо любой запрос будет всегда использовать 2 поля и придется делать лукапы.
Один из индексов (id1, id2 или id2, id1) можно сделать кластерным, сэкономив тем самым место. В таком случае, второй индекс(тот что будет некластерным) можно смело делать с include(id), потому что индекс для поиска по обоим полям у нас уже есть, а порядок их не имеет абсолютно никакого значения.

О сплитах я бы не стал переживать, они все равно будут, а учитывая, что индекс в данном случае это и есть вся таблица, то какая разница?
7 мар 13, 23:11    [14026542]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно делать индексы на таблице многие ко многим?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
super-code
Только сравнивать нечего, пока ничего не создано.
Можно ещё подумать о использовании int вместо uniqueidentifier, на тот случай, если uniqueidentifier выбрали просто из за "крутости", а не по каким то другим соображениям.
8 мар 13, 00:47    [14026786]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить