Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Индексация FOREIGN KEY  [new]
Relic Hunter
Member

Откуда: AB
Сообщений: 7380
Вот рассматриваю уже какую базу на MSSQL и вижу, что люди не индексируют foreign key колонки. Или для сиквела это не критично? Я больше для Оракла разрабатывал. Хотя базы "коробочные" от известных вендоров. Deltek Vision, например.
17 июн 14, 01:34    [16172930]     Ответить | Цитировать Сообщить модератору
 Re: Индексация FOREIGN KEY  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31446
Relic Hunter
Вот рассматриваю уже какую базу на MSSQL и вижу, что люди не индексируют foreign key колонки. Или для сиквела это не критично? Я больше для Оракла разрабатывал. Хотя базы "коробочные" от известных вендоров. Deltek Vision, например.
Подход не зависит от производителя СУБД, для сиквела это так же, как для оракла.

Индексировать foreign key колонки нужно для конкретной цели - для поиска по этим колонкам. Если он есть, то нужен индекс, если нет, то не нужен; в общем, в этом FK колонка не отличается от любой другой.
17 июн 14, 02:59    [16172999]     Ответить | Цитировать Сообщить модератору
 Re: Индексация FOREIGN KEY  [new]
Relic Hunter
Member

Откуда: AB
Сообщений: 7380
alexeyvg,

А джоины таблиц по индексу "Cluster index range scan" vs "non-custered index seek", блокировки уровня таблицы при "update", "delete" в дочерних, не? Такого не бывает? Причем здесь поиск?
17 июн 14, 04:32    [16173026]     Ответить | Цитировать Сообщить модератору
 Re: Индексация FOREIGN KEY  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Relic Hunter
alexeyvg,

А джоины таблиц по индексу "Cluster index range scan" vs "non-custered index seek",
Джойн может выполнятся либо от главной таблицы к дочерней, либо наоборот. И только в одном из этих случаев от индекса будет хоть какой-то смысл.
Relic Hunter
блокировки уровня таблицы при "update", "delete" в дочерних, не? Такого не бывает? Причем здесь поиск?
Update чего? Первичного ключа, который зачастую еще и identity? И как часто вы выполняете подобные операции?
17 июн 14, 08:53    [16173296]     Ответить | Цитировать Сообщить модератору
 Re: Индексация FOREIGN KEY  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31446
Relic Hunter
alexeyvg,

А джоины таблиц по индексу "Cluster index range scan" vs "non-custered index seek", блокировки уровня таблицы при "update", "delete" в дочерних, не? Такого не бывает? Причем здесь поиск?
Про что вы говорите, можно конкретный пример?

Ещё раз - FK и необходимость создания индекса абсолютно не связаны.
Если нужно сделать джойн по полю, и будет поиск по этому полю, то индекс нужен. Если не будет поиска по этому полю, то индекса не нужно, несмотря на джойн.

Простой пример:

В таблице продаж есть поле SalesManagerId, ссылающееся на таблицу менеджеров.

Для запроса, в котором нужно вывести менеджера, отвечающего за сделку, индекс по SalesManagerId не нужен.
Для запроса, в котором нужно вывести все сделки от конкретного менеджера, индекс по SalesManagerId нужен.
17 июн 14, 09:51    [16173600]     Ответить | Цитировать Сообщить модератору
 Re: Индексация FOREIGN KEY  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31446
Relic Hunter
блокировки уровня таблицы при "update", "delete" в дочерних, не? Такого не бывает? Причем здесь поиск?
При том, что проверка констрейна при "update", "delete" таблицы-справочника является "поиском". То есть если такие операции в системе предусмотрены, то нужно сохздать индекс на FK колонку.
Но обычно таких операций не предусмотрено, это большая редкость, поэтому СУБД автоматически не создают индексы на FK колонки, решение о создании нужно принимать проектировщику модели данных. Иначе для 99% систем получим просто дополнительное замедление и блокировки.
17 июн 14, 09:55    [16173631]     Ответить | Цитировать Сообщить модератору
 Re: Индексация FOREIGN KEY  [new]
Glory
Member

Откуда:
Сообщений: 104760
BOL - FOREIGN KEY Constraints

Indexing FOREIGN KEY Constraints
Creating an index on a foreign key is often useful for the following reasons:

-Changes to PRIMARY KEY constraints are checked with FOREIGN KEY constraints in related tables.

- Foreign key columns are frequently used in join criteria when the data from related tables is combined in queries by matching the column or columns in the FOREIGN KEY constraint of one table with the primary or unique key column or columns in the other table. An index enables the Database Engine to quickly find related data in the foreign key table. However, creating this index is not required. Data from two related tables can be combined even if no PRIMARY KEY or FOREIGN KEY constraints are defined between the tables, but a foreign key relationship between two tables indicates that the two tables have been optimized to be combined in a query that uses the keys as its criteria. For more information about using FOREIGN KEY constraints with joins, see Join Fundamentals and Query Types and Indexes.
17 июн 14, 10:31    [16173900]     Ответить | Цитировать Сообщить модератору
 Re: Индексация FOREIGN KEY  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Индекс на FK не нужен, только лишь что это FK. Если вы делает джойн A.B_id -> B.id (1 ко многим), то индекс нужен на B.id, но не на A.B_id. Если вы делает джойн в обратном направлении, то уже B.id становиться внешним ключом.

Если вы делаете фильтр по A.B_id (WHERE A.B_id = ... , WHERE A.B_id IN (...)), то тогда индекс на A.B_id нужен, но не потому что он внешний ключ, а потому, что он присутствует в WHERE
17 июн 14, 12:32    [16175015]     Ответить | Цитировать Сообщить модератору
 Re: Индексация FOREIGN KEY  [new]
Glory
Member

Откуда:
Сообщений: 104760
a_voronin
Если вы делает джойн в обратном направлении,

Ммм, а как задать "направление джойна" ?
17 июн 14, 12:34    [16175045]     Ответить | Цитировать Сообщить модератору
 Re: Индексация FOREIGN KEY  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Если 1 ко многим, то джойн идёт от 1 ко многим. Если 1 к 1 или 1 к 0, то план надо смотреть. А вообще схему БД рисуют и на на ней стрелочками указывают.
17 июн 14, 12:39    [16175092]     Ответить | Цитировать Сообщить модератору
 Re: Индексация FOREIGN KEY  [new]
Glory
Member

Откуда:
Сообщений: 104760
a_voronin
Если 1 ко многим, то джойн идёт от 1 ко многим. Если 1 к 1 или 1 к 0, то план надо смотреть. А вообще схему БД рисуют и на на ней стрелочками указывают.

Т.е. 1-1 или 1-м - это и есть "направление джойна" ?
17 июн 14, 12:42    [16175133]     Ответить | Цитировать Сообщить модератору
 Re: Индексация FOREIGN KEY  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Glory
a_voronin
Если 1 ко многим, то джойн идёт от 1 ко многим. Если 1 к 1 или 1 к 0, то план надо смотреть. А вообще схему БД рисуют и на на ней стрелочками указывают.

Т.е. 1-1 или 1-м - это и есть "направление джойна" ?


Glory -- мне кажется вы начали выпендриваться не по делу. Вы сами прекрасно понимаете, что такого JOIN, и какого его направление по плану, по схеме и на какой стороне нужен индекс.
17 июн 14, 13:06    [16175373]     Ответить | Цитировать Сообщить модератору
 Re: Индексация FOREIGN KEY  [new]
Glory
Member

Откуда:
Сообщений: 104760
a_voronin
Glory -- мне кажется вы начали выпендриваться не по делу.

Ну конечно.
Наверное я хочу, чтобы вас уволили. И меня даже не пугает участь какого-то там американского админа.

a_voronin
Вы сами прекрасно понимаете, что такого JOIN, и какого его направление по плану,

Я НЕ понимаю, что такое "направление джойна"
Наверное потому, что для вас все едино, что джойy, что foreign constraint
17 июн 14, 13:11    [16175411]     Ответить | Цитировать Сообщить модератору
 Re: Индексация FOREIGN KEY  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Glory
a_voronin
Glory -- мне кажется вы начали выпендриваться не по делу.

Ну конечно.
Наверное я хочу, чтобы вас уволили. И меня даже не пугает участь какого-то там американского админа.

a_voronin
Вы сами прекрасно понимаете, что такого JOIN, и какого его направление по плану,

Я НЕ понимаю, что такое "направление джойна"
Наверное потому, что для вас все едино, что джойy, что foreign constraint


Просто по стилю выпендривания, вы похожи на этого админа. Может вы его знали, его звали Antuan Bocony. Он негр.

Если согласно плану или схеме БД или бизнес-лигике, делается сначала скан по таблице A, а потом look up или JOIN на таблицу Б, то направление JOIN от A к Б и индекс нужен на таблице Б. Вот и всё, что я хотел сказать, пока вы не влезли.

При этом не факт, что SELECT ... FROM A JOIN B совпадает с направление JOIN по плану.
17 июн 14, 13:26    [16175536]     Ответить | Цитировать Сообщить модератору
 Re: Индексация FOREIGN KEY  [new]
Glory
Member

Откуда:
Сообщений: 104760
a_voronin
Если согласно плану или схеме БД или бизнес-лигике, делается сначала скан по таблице A, а потом look up или JOIN на таблицу Б, то направление JOIN от A к Б и индекс нужен на таблице Б. Вот и всё, что я хотел сказать, пока вы не влезли.

Т.е. вы сам придумали термин "направление джойна" и теперь все другие его должны безоговорочно принять ?
17 июн 14, 13:29    [16175571]     Ответить | Цитировать Сообщить модератору
 Re: Индексация FOREIGN KEY  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Как говорят в Штатах "you said it"
17 июн 14, 13:39    [16175665]     Ответить | Цитировать Сообщить модератору
 Re: Индексация FOREIGN KEY  [new]
sphinx_mv
Member [заблокирован]

Откуда:
Сообщений: 1672
a_voronin
Если 1 ко многим, то джойн идёт от 1 ко многим. Если 1 к 1 или 1 к 0, то план надо смотреть. А вообще схему БД рисуют и на на ней стрелочками указывают.
Вообще-то... Насколько я "в теме"... "Стрелочками" на схемах БД рисуют не "джойны", а связи - те самые FK, для которых, кстати, "направление" однозначным образом декларируется при создании.

ЗЫ. Сегодня точно не "пятница"? :)
17 июн 14, 13:43    [16175694]     Ответить | Цитировать Сообщить модератору
 Re: Индексация FOREIGN KEY  [new]
Glory
Member

Откуда:
Сообщений: 104760
a_voronin
Как говорят в Штатах "you said it"

Может вам лучше и ограничить регион своего общения Штами ?
17 июн 14, 13:43    [16175698]     Ответить | Цитировать Сообщить модератору
 Re: Индексация FOREIGN KEY  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
sphinx_mv
a_voronin
Если 1 ко многим, то джойн идёт от 1 ко многим. Если 1 к 1 или 1 к 0, то план надо смотреть. А вообще схему БД рисуют и на на ней стрелочками указывают.
Вообще-то... Насколько я "в теме"... "Стрелочками" на схемах БД рисуют не "джойны", а связи - те самые FK, для которых, кстати, "направление" однозначным образом декларируется при создании.

ЗЫ. Сегодня точно не "пятница"? :)


Блин Ребят, если план исполнения запроса, на нем есть стрелочки. Происходит некоторая последовательность действий. В любом случае вы как-то мыслите, что вы к таблице А подтягиваете, таблицу Б. Во всяком случае, если взять хранилище данных, схему звезда, то вы к центральной таблице фактов, подтягиваете факты.

Мы как-то сильно уклонились от первоначальной темы. Был вопрос, где создавать индексы. Понятно, что если таблицы с одинаковым кол-вом записей, то тут направления нет. Вертикальное деление. Но если вы выбираете пользователей и подтягиваете к ним группы, в которых они состоят, то направление скорее от пользователей к группам.

Если вы берете продажи и подтягиваете к ним магазины, то направление от продаж к магазинам. А может быть и наооборот, вы берете магазины и выбираете их продажи. Если логическое направление, которое в НЕКОТОРЫХ СЛУЧАЯХ надо учитывать при написании запросов. Индекс надо выбирать на нужной стороне. При этом может быть он нужен на обоих.
17 июн 14, 14:12    [16175903]     Ответить | Цитировать Сообщить модератору
 Re: Индексация FOREIGN KEY  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
a_voronin,

то вы к центральной таблице фактов, подтягиваете справочники.
17 июн 14, 14:13    [16175906]     Ответить | Цитировать Сообщить модератору
 Re: Индексация FOREIGN KEY  [new]
Glory
Member

Откуда:
Сообщений: 104760
a_voronin
Блин Ребят, если план исполнения запроса, на нем есть стрелочки

Ага. И они называются "направление джойна".

a_voronin
Мы как-то сильно уклонились от первоначальной темы. Был вопрос, где создавать индексы.

Нет.
Вопрос был - "индексируете лы foreign key колонки. Или для сиквела это не критично?"

Все остальное вы додумали. Так что не надо про звезды, магазины и другие случаи из "моей практики"
17 июн 14, 14:15    [16175924]     Ответить | Цитировать Сообщить модератору
 Re: Индексация FOREIGN KEY  [new]
Maxx
Member [скрыт]

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

А давайте вещи все таки называть своими именами
17 июн 14, 14:19    [16175951]     Ответить | Цитировать Сообщить модератору
 Re: Индексация FOREIGN KEY  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Glory
a_voronin
Блин Ребят, если план исполнения запроса, на нем есть стрелочки

Ага. И они называются "направление джойна".

a_voronin
Мы как-то сильно уклонились от первоначальной темы. Был вопрос, где создавать индексы.

Нет.
Вопрос был - "индексируете лы foreign key колонки. Или для сиквела это не критично?"

Все остальное вы додумали. Так что не надо про звезды, магазины и другие случаи из "моей практики"


"И они называются "направление джойна". You said it, not me
17 июн 14, 14:29    [16176036]     Ответить | Цитировать Сообщить модератору
 Re: Индексация FOREIGN KEY  [new]
Glory
Member

Откуда:
Сообщений: 104760
a_voronin
"И они называются "направление джойна". You said it, not me

Хватит выпендриваться.
Вы по всей видимости пришли сюда в роли миссионера ?
Донести непросвещенным массам все богатство своего немеренного опыта ?
Так я быстро организую "отпуск"
17 июн 14, 14:32    [16176053]     Ответить | Цитировать Сообщить модератору
 Re: Индексация FOREIGN KEY  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7869
Дабы отбросить разнотолки читайте справку, топик "Ограничения первичных и внешних ключей" подраздел "Индексы в ограничениях внешнего ключа".
17 июн 14, 16:40    [16177149]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить