2008-10-15 8 views
6

J'ai besoin d'indexer un champ varchar sur ma table dans MS SQL Server 2005, mais je ne vois pas comment le faire. Si j'essaye d'ajouter un index non-groupé sur le champ, il indique "la colonne" xxxx "dans la table" mytable "est d'un type qui est invalide pour l'usage comme colonne de clef dans un index"Index varchar sur MS SQL Server 2005

Ma table a un ID int incrémentation automatique défini comme clé primaire sur la table. Si je définissez cette propriété en tant qu'index, puis ajoutez ma colonne varchar en tant que "colonne incluse", l'index passe à travers. Mais je ne suis pas sûr que ce soit ce que je veux - je veux être capable de faire une recherche sur la table basée uniquement sur le champ varchar, et ma compréhension des index était que tous les éléments indexés devaient être fournis pour voir une accélération dans la requête, mais je ne veux pas avoir à inclure l'ID int (parce que je ne sais pas ce que c'est, au moment de cette requête donnée). Est-ce que j'essaye de faire ceci incorrectement? Est-ce que l'ID + mon varchar en tant que colonne incluse accomplirait ce que je cherche?

Répondre

10

Est-ce que votre varchar(max)? Je pense que ceux-ci ne sont pas autorisés à être utilisés dans un index.

Sinon, postez votre instruction CREATE TABLE, normalement il n'y a pas de problème pour ajouter un varchar à un index.

2

Non, la colonne varchar ID + ne fonctionnerait pas. Cela fonctionnerait bien pour les requêtes où vous faites une recherche sur l'ID et sélectionnez uniquement l'ID ou/et la colonne varchar - alors vous auriez un index de couverture et tout pourrait être récupéré seulement en regardant l'index.

Je suppose que vous avez un index cluster sur votre colonne ID car c'est la clé primaire. Ensuite, vous devez créer un index non cluster sur la colonne varchar - ce qui devrait être possible. L'index non cluster inclura automatiquement l'ID.

Rappelez-vous aussi que l'index ne sera bon que pour les requêtes comme WHERE VarcharColumn = 'xyz' et WHERE VarcharColumn LIKE 'xyz%'.

Cela n'aidera pas les requêtes LIKE '% xyz%' et '% xyz'.

0

Vous n'avez pas besoin d'inclure le champ varchar dans la clé primaire pour qu'il soit indexé. Pour créer un index, modifiez simplement la table dans Management Studio, cliquez sur le bouton Gérer les index et les clés et cliquez sur Ajouter pour ajouter un nouvel index. Ensuite, sélectionnez le champ VARCHAR. Il ne devrait y avoir aucun problème.

1

La définition d'une colonne en tant que clé primaire par défaut crée un index clusterisé. Vous n'avez donc pas besoin de créer un autre index INT + VARCHAR. Ce que vous cherchez est un index sur votre VARCHAR seul - sans + INT, puisque votre clé primaire est implicitement incluse - après tout SQL Server devrait être capable de localiser la ligne réelle lors de la recherche d'index. Il y a une restriction cependant, je crois que la taille globale des colonnes d'index devrait être < 900 byte (au moins c'était avec SQL Server 2000). Quelle est la durée de votre VARCHAR?

4

Je suppose que yours est une colonne VARCHAR (MAX) qui, comme l'indique l'erreur, est un type de données invalide pour un index. Suggestion: créez une colonne calculée qui est la valeur de hachage de la colonne VARCHAR (MAX) (par exemple, en utilisant la fonction HashBytes), puis créez un index sur la colonne calculée uniquement. Ensuite, dans la condition de recherche (clause WHERE) de votre DML SQL, vous utiliserez à la fois la valeur de recherche VARCHAR (MAX) elle-même plus un hachage de votre valeur de recherche VARCHAR (MAX) sur les colonnes respectives de votre table. Cela peut être une bonne idée d'encapsuler le hachage des valeurs de recherche dans une procédure stockée 'helper'.

+0

+1 Pour mentionner la fonction HashBytes – CSharper