Dans ma base de données, supposons que nous avons une table définie comme suit:SQL Server 2005, les index larges, des colonnes calculées et des requêtes sargable
CREATE TABLE [Chemical](
[ChemicalId] int NOT NULL IDENTITY(1,1) PRIMARY KEY,
[Name] nvarchar(max) NOT NULL,
[Description] nvarchar(max) NULL
)
La valeur de nom peut être très grand, donc nous devons utiliser nvarchar (max). Malheureusement, nous voulons créer un index sur cette colonne, mais nvarchar (max) n'est pas supporté dans un index.
Nous créons donc la colonne calculée suivant et index associé en fonction il:
ALTER TABLE [Chemical]
ADD [Name_Indexable] AS LEFT([Name], 20)
CREATE INDEX [IX_Name]
ON [Chemical]([Name_Indexable])
INCLUDE([Name])
L'indice ne sera pas unique, mais nous pouvons garantir l'unicité via un déclencheur.
Si nous effectuons la requête suivante, les résultats du plan d'exécution dans un index scan, ce qui est pas ce que nous voulons:
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'
Cependant, si nous modifions la requête pour le faire « sargable, » alors ce que les résultats du plan d'exécution dans un indice cherchent, qui est que nous voulons:
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'
est-ce une bonne solution si nous contrôlons le format de toutes les requêtes exécutées sur le base de données via notre niveau intermédiaire? Y a-t-il un meilleur moyen? Est-ce un kludge majeur? Devrions-nous utiliser l'indexation de texte intégral?
[Nom] est un nom chimique réel, pas une liste délimitée par des virgules, désolé pour la confusion! – luksan
petite remarque: vous créez une colonne calculée [Name_Indexable] 'et utilisez plus tard' SELECT ... WHERE [Indexable_Name] = ... '. Il devrait être changé en '[Name_Indexable]'. – Oleg