Есть табличка, которая содержит в себе информацию о магазинах - кому они подчинены, в каком регионе находятся, где хранятся и пр. Список столбцов такой:
[DivisionNodeName] varchar(100)
,[DSMid] int non-unique
,[DSMname]
,[TSMNodeName]
,[TSMid] int non-unique
,[TSMname]
,[SVNodeName]
,[SVid] int non-unique
,[SVname]
,[TPNodeName]
,[TPid] int non-unique
,[TPname]
,[TTfid] int, unique
,[TTexid]
,[TTname]
,[TTowner] int
Собственно вопрос - куда и какие индексы добавлять по тем полям, что я отметил типом данных.
Поле TTfid точно делать (уникальным, кластеризованным?), причем эта цифра частично связана со следующим полем. Код точки начинается с номера сервера из столбца TTowner, т.е. 20000001 на сервере 2, 30000435 на сервере 3 и т.д.
Сейчас индекс есть только на нем:
CREATE CLUSTERED INDEX [IX_ttfid] ON [dbo].[DMS_RU_TerritoryHierarchy]
([TTfid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
Поле TTowner содержит сервер, есть смысл объединять с прошлым? Т.к. это должно упростить поиск страниц, какой индекс из него делать? Если да, то какой ставить?
dsmid\tsmid\svid - это коды сотрудников, они повторяются, есть ли смысл пытаться повестить индекс на них? Что-то кажется что нет, даже если захочется искать по ним... хотя?
region - есть ли смысл вешать туда индекс? Если да, то какой? По факту это должно облегчить поиск точек, которые относятся к конкретному региону, не затрагивая сервера.
Всего в таблице порядка 400к строк (немного, да), перед записью индекс сейчас снимается, таблица чистится и снова загружаются данные. индекс ставится. И так каждый день.
В последствии к этой таблице обращаются другие запросы, которые, например, подтягивают вышестоящего сотрудника для точки для порядка 30-40 миллионов документов (join идет по полям: TTfid, TPid и TTowner)
Кластерный индекс лучше объявить уникальным (раз вы пишете, что TTfid уникальное. Оптимизатору всегда лучше предоставлять максимум информации.
Что касается индексов по конкретным столбцам - нужно видеть, какие конкретно запросы вы хотите оптимизировать. Без этого - гадание на кофейной гуще. Для запроса, где "join идет по полям: TTfid, TPid и TTowner" уникальный кластерный индекс по TTfld - то что доктор прописал.
zhaar, что значит "разбить данные по страницам"? Вы можете его добавить, но пользы от этого будет ноль, а ключ кластерного индекса на 4 байта увеличите.
Минимум: постройте план выполнения запроса. Там будут подсказки, какой индекс добавить. Если этих подсказок нет, значит оптимизатор с помощью статистики справился сам.