В моей базе данных предположим, что у нас есть таблица, определенная следующим образом:
CREATE TABLE [Chemical](
[ChemicalId] int NOT NULL IDENTITY(1,1) PRIMARY KEY,
[Name] nvarchar(max) NOT NULL,
[Description] nvarchar(max) NULL
)
Значение для имени может быть очень большим, поэтому мы должны использовать nvarchar (max). К сожалению, мы хотим создать индекс для этого столбца, но nvarchar (max) не поддерживается внутри индекса.
Итак, мы создаем следующий вычисляемый столбец и связанный с ним индекс:
ALTER TABLE [Chemical]
ADD [Name_Indexable] AS LEFT([Name], 20)
CREATE INDEX [IX_Name]
ON [Chemical]([Name_Indexable])
INCLUDE([Name])
Индекс не будет уникальным, но мы можем обеспечить уникальность с помощью триггера.
Если мы выполним следующий запрос, план выполнения приведет к индексу scan , а это не то, что нам нужно:
SELECT [ChemicalId], [Name], [Description]
FROM [Chemical]
WHERE [Name]='[1,1''-Bicyclohexyl]-2-carboxylic acid, 4'',5-dihydroxy-2'',3-dimethyl-5'',6-bis[(1-oxo-2-propen-1-yl)oxy]-, methyl ester'
Однако, если мы изменим запрос, чтобы сделать его «sargable», тогда план выполнения приведет к индексу seek , что и нужно:
SELECT [ChemicalId], [Name], [Description]
FROM [Chemical]
WHERE [Indexable_Name]='[1,1''-Bicyclohexyl]-' AND [Name]='[1,1''-Bicyclohexyl]-2-carboxylic acid, 4'',5-dihydroxy-2'',3-dimethyl-5'',6-bis[(1-oxo-2-propen-1-yl)oxy]-, methyl ester'
Является ли это хорошим решением, если мы контролируем формат всех запросов к базе данных через наш средний уровень? Есть ли способ лучше? Это главный клудж? Должны ли мы использовать полнотекстовое индексирование?