Я создаю веб-приложение с использованием SQL Server 2008, и у меня возникают трудности с лучшей стратегией индексации, учитывая наш прецедент. Например, большинство таблиц структурированы похоже на следующее:Стратегия индексирования SQL Server
CREATE TABLE Jobs
(
Id int identity(0, 1) not null,
CmpyId int not null default (0),
StatusId int not null default (0),
Name nvarchar(100) null,
IsDeleted bit not null default (0),
CONSTRAINT [PK_dbo.Jobs]
PRIMARY KEY NONCLUSTERED (Id ASC))
CREATE CLUSTERED INDEX IX_Jobs_CmpyIdAndId
ON Jobs (CmpyId, Id)
CREATE INDEX IX_Jobs_CmpyIdAndStatusId
ON Jobs (CmpyId, StatusId)
В нашем приложении, пользователи разделены на различные компании, что приводит к практически все запросы ищут подобные следующий:
SELECT *
FROM Jobs
WHERE CmpyId = @cmpyId AND ...
Кроме того, рабочие места часто обращались с StatusId
(аннулированы = -1, до = 0, = 1 открыт, назначается = 2, закрытые = 3), подобное приведенному ниже:
SELECT *
FROM Jobs
WHERE CmpyId = @cmpyId
AND StatusId >= 0
AND StatusId < 3
Могу ли я лучше использовать составной кластерный индекс, как показано выше, или мне следует использовать кластерный индекс по умолчанию только для поля Id
и создать отдельный индекс для CmpyId
?
Для столбца StatusId
, было бы правильным, если бы отфильтрованный индекс был бы способ пойти?
Я также рассматриваю разметку таблицы на CmpyId
или StatusId
, но не уверен, что было бы лучше (или если раздел не является лучшим).
Общее говорение лучше всего подходит для кластерного индекса как можно более компактного и компактного. В вашем случае я бы сохранил кластеризованный индекс в 'Id' и создал некластеризованный индекс на' CmpnId'. 'StatusId', поскольку может иметь только 5 значений, которые, как я подозреваю, будут иметь низкую избирательность, поэтому индекс, который, я думаю, не приведет к повышению производительности. – shadow
Просто примечание: ** всегда ** ограничивает имя самостоятельно. Если вы оставите его до SQL Server, он присвоит ему случайное имя. Это может быть ад, когда вы позже решите изменить структуру базы данных, используя SQL-скрипты, поскольку у вас нет собственных имен. В этом случае я имею в виду ограничения DEFAULT, которые у вас есть в определении таблицы. –
На dba.stackexchange.com есть две темы, которые могут предложить ценную информацию. [Здесь] (https://dba.stackexchange.com/questions/108881/should-the-index-on-an-identity-column-be-nonclustered) и [здесь] (https://dba.stackexchange.com/вопросы/7741/когда-должна-а-первичный ключ-быть объявлены-некластерный). –