Поможет ли создание индекса в этом случае? - PullRequest
1 голос
/ 11 мая 2010

Я все еще учусь на SQL-SERVER2005.

Вот моя структура таблицы

CREATE TABLE [dbo].[Trn_PostingGroups](
[ControlGroup] [char](5) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[PracticeCode] [char](5) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[ScanDate] [smalldatetime] NULL,
[DepositDate] [smalldatetime] NULL,
[NameOfFile] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[DepositValue] [decimal](11, 2) NULL,
[RecordStatus] [char](1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
CONSTRAINT [PK_Trn_PostingGroups_1] PRIMARY KEY CLUSTERED 
(
    [ControlGroup] ASC,
    [PracticeCode] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

Сценарий 1 : Предположим, у меня есть такой запрос ...

Select * from Trn_PostingGroups where PracticeCode = 'ABC'

Поможет ли индексация по Практическому коду отдельно сделать мой запрос быстрее ??

Сценарий 2 :

Select * from Trn_PostingGroups 
where 
    ControlGroup = 12701 
    and PracticeCode = 'ABC'
    and NameOfFile = 'FileName1'

Будет ли индексация по NameOfFile отдельно помочь мне в ускорении моего запроса ??

Ответы [ 2 ]

1 голос
/ 11 мая 2010

Если вы выбираете только первое поле (ControlGroup), это основной вид кластеризованного индекса, и вам не нужно индексировать другое поле.

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

Как правило, вы должны индексировать поля, которые обычно используются в предложениях SORT и WHERE. Это конечно слишком упрощено.

См. эту статью для получения дополнительной информации об оптимизации (статистика и анализатор запросов).

0 голосов
/ 11 мая 2010

Вы можете использовать только один индекс на таблицу для каждого запроса (если вы не рассматриваете самостоятельные объединения или CTE). если у вас есть несколько, которые можно использовать для одной и той же таблицы в одном запросе, SQL Server будет использовать статистику, чтобы определить, какой из них лучше использовать.

В сценарии 1, если вы создаете индекс только на PracticeCode, он обычно будет использоваться, если у вас достаточно строк, чтобы сканирование таблицы стоило дороже, и в этом столбце был широкий диапазон значений. Индекс не будет использоваться, если в таблице всего несколько строк (просто взглянуть на них все быстрее). Кроме того, индекс не будет использоваться, если большинство значений в этом столбце совпадают. Он не будет использовать PK в этом запросе, это будет похоже на поиск имени в телефонной книге, вы не можете использовать индекс, потому что это фамилия + имя. Возможно, вы захотите изменить свой ПК на PracticeCode+ControlGroup, если вы никогда не выполняете поиск в ControlGroup.

В Сценарии 2, если у вас есть индекс для NameOfFile, он, вероятно, будет использовать PK и игнорирует индекс NameOfFile. Если вы не сделаете индекс NameOfFile уникальным, и тогда это бросок. Вы можете попытаться создать индекс (в дополнение к вашему PK) для ControlGroup + PracticeCode + NameOfFile. если у вас много файлов на ControlGroup + PracticeCode, то он может выбрать этот индекс поверх индекса PK.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...