SQL Server - дизайн кластерного индекса для словаря - PullRequest
2 голосов
/ 03 октября 2010

Хотелось бы получить совет от этого. У меня есть таблица, в которой я хочу отслеживать объект и список ключей, связанных с объектом. Пример:

OBJECTID   ITEMTYPE   ITEMKEY
--------   --------   -------
1          1          THE
1          1          BROWN
1          2          APPLE
1          3          ORANGE
2          2          WINDOW

И OBJECTID, и ITEMKEY имеют высокую селективность (т. Е. OBJECTID и ITEMKEY сильно различаются). Мой доступ осуществляется двумя способами:

  • By OBJECTID: Каждый раз, когда объект изменяется, список ключей изменяется, поэтому ключ необходим на основе OBJECTID. Изменения происходят часто.

  • По пункту: Это для поиска по ключевым словам, а также часто.

Таким образом, мне, вероятно, нужны два ключа и выбрать один для кластеризованного индекса (тот, к которому чаще всего обращаются, или где я хочу, чтобы скорость была, пока давайте предположим, что я буду определять приоритет OBJECTID для кластеризованного). Что меня смущает, так это то, как я должен это проектировать.

Мои вопросы: что лучше:

a) Кластерный индекс (OBJECTID, ITEMTYPE, ITEMKEY), а затем индекс (ITEMKEY). Меня беспокоит то, что поскольку кластерный индекс очень большой (2 целых, 1 строка), индекс будет большим, потому что все элементы индекса должны указывать обратно на кластерный ключ.

b) Создайте новый столбец с рабочим идентификатором DIRECTORYID (целое число) в качестве первичного ключа и кластеризованного индекса и объявите два индекса для (OBJECTID, ITEMTYPE, ITEMKEY) и просто (ITEMKEY). Это сведет к минимуму пространство индекса, но увеличит затраты на поиск.

c) Кластерный индекс (OBJECTID, ITEMTYPE, ITEMKEY) и материализованное представление (ITEMKEY, ITEMTYPE, OBJECTID) на нем. Моя логика заключается в том, что это позволяет избежать поиска ключа и будет по-прежнему таким же большим, как индекс с поиском в а), за счет более высоких издержек.

d) Э-э-э ... может быть, есть лучший способ, учитывая требования?

Спасибо заранее, Andrew

1 Ответ

1 голос
/ 03 октября 2010

Если возможно, старайтесь, чтобы ваш кластеризованный ключ был как можно меньше, поскольку он также будет добавлен ко всем некластеризованным индексам в вашей таблице.

Поэтому я бы использовал INT, если это возможноили, возможно, комбинация двух INT - но, безусловно, никогда не столбец VARCHAR - особенно, если этот столбец потенциально широкий (> 10 символов) и должен измениться.

Итак, из представленных вами вариантов, ялично я бы выбрал б) - почему ??

Добавление суррогата DirectoryID удовлетворит все ключевые критерии для ключа кластеризации:

  • small
  • stable
  • уникальное
  • постоянно увеличивающееся

и другие некластеризованные индексы будут затронуты минимально.

См. выдающийся пост в блоге Кимберли Триппа по основным критериям выбора хорошего ключа кластеризации для ваших таблиц SQL Server - очень полезно и полезно!

Чтобы удовлетворить ваши требования к запросам, я бы добавил два некластеризованных индекса, один для ObjectID(возможно, включая другие часто используемые столбцы) и еще один на ItemKey для поиска по ключевому слову.

...