2010-10-03 2 views
2

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

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

Оба OBJECTID и ItemKey имеют высокую селективность (то есть ObjectId и ItemKey очень разнообразны). Мой доступ двумя способами:

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

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

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

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

а) Кластерный индекс (OBJECTID, ItemType, ItemKey), а затем индекс (ItemKey). Я обеспокоен тем, что, поскольку кластерный индекс настолько велик (2 ints, 1 строка), индекс будет большим, потому что все элементы индекса должны были вернуться к кластерному ключу.

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

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

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

Заранее спасибо, Andrew

+0

Почему вы думаете, что вам нужно класть на '(OBJECTID, ITEMTYPE, ITEMKEY)' вместо '(OBJECTID)' только? – Lucero

+0

Если вы пытаетесь создать высокоэффективный поиск по ключевым словам в SQL Server, вам следует рассмотреть полнотекстовый поиск: http://msdn.microsoft.com/en-us/library/ms142583.aspx –

+1

@Lucero: кластеризация ключ должен быть уникальным - и ObjectId - нет. В этом случае SQL Server добавит четырехбайтовый идентификатор к вашим записям индекса - вы можете избежать этого, выбирая по-настоящему уникальный столбец (INT IDENTITY) для вашего ключа кластеризации. –

ответ

1

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

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

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

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

  • небольшого
  • стабильной
  • уникального
  • постоянно увеличивающегося

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

См. Kimberly Tripp's outstanding blog post по основным критериям выбора хорошего ключа кластеризации на таблицах SQL Server - очень полезно и полезно!

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

+0

Благодарим за то, что вы отметили сообщение, это просветительское (может показаться более интуитивным, чтобы попытаться сгруппировать по тому, что чаще всего используется, но из статьи, похоже, в ситуациях реального мира, есть и другие накладные расходы, что позволяет лучше следовать эти правила на ключ кластера!) – andrwo

+0

marc_s: У меня вопрос для вашего мнения: было бы целесообразно использовать (OBJECTID, DirectoryID) как кластер-ключ? Это, по крайней мере, сделало бы его кластером по одному критерию, сохраняя ключ кластера небольшим (но потеряв вставку всегда в конце свойства таблицы). Стоит ли это делать, если бы вы делали это в своем дизайне? – andrwo

+0

@andrwo: if DirectoryID будет столбцом INT IDENTITY, тогда я бы включил только этот единственный INT - нет смысла добавлять второй INT в индекс кластеризации, действительно - или почему вы хотите это сделать? –