Cette question concerne les performances de l'index SQL Server avec un varchar(2000)
comme un INCLUDE
dans un index de couverture.
J'essaie d'améliorer les performances dans une application de base de données lente et instable. Dans certains cas, les données sont accessibles par les grandes chaînes de varchar, avec les requêtes , y compris les opérations de chaîne multple comme SUBSTRING()
, SPACE()
et DATALENGTH()
. Voici un exemple simplifié d'accès;
update fattable set col3 =
SUBSTRING(col3,1,10) + '*' +
SUBSTRING(col3,12,DATALENGTH(col3)-12)
from fattable where substring(col3,10,1) = 'A' and col2 = 2
Le schéma ressemble à ceci:
CREATE TABLE [dbo].[FatTable](
[id] [bigint] IDENTITY(1,1) NOT NULL,
[col1] [nchar](12) NOT NULL,
[col2] [int] NOT NULL,
[col3] [varchar](2000) NOT NULL, ...
L'index suivant a été défini, avec un champ couvrant sur la grande colonne de texte.
CREATE NONCLUSTERED INDEX [IndexCol2Col3] ON [dbo].[FatTable] ( [col2] ASC )
INCLUDE( [col3] )
D'après ce que j'ai lu, c'est MAUVAIS de mettre de grands champs de données dans un index. J'ai lu plusieurs articles, dont http://msdn.microsoft.com/en-us/library/ms190806.aspx qui discutent de l'impact de la pagination et de la taille du disque sur les performances de l'index. Cela étant dit, le plan de requête utilise définitivement l'index de couverture. Je n'ai pas suffisamment d'informations pour déterminer combien cela me coûte réellement en termes de charge système. Je sais que dans l'ensemble, le système fonctionne mal et je crains que ce soit l'un des problèmes. Des questions:
Mettre cette
varchar(2000)
colonne dans l'indexINCLUDE
est-il une bonne idée?Étant donné que les
INCLUDE
champs sont stockés dans des nœuds feuilles, ont-ils beaucoup de performances d'index d'impact?
Mise à jour: Merci pour les excellentes réponses! C'est une question injuste à certains égards - comme vous le dites, il n'y a pas de bonne réponse absolue sans statistiques et profilage réels. Comme tant de problèmes de performances, je suppose que la réponse est "cela dépend".
VARCHAR(2000)
qui ne stocke généralement que dix caractères est une chose; un solide 2000 octets par enregistrement est autre chose.