2010-01-29 4 views
0

J'utilise une requête similaire comme celui-cirequête SQL avec plusieurs index - SQL Server 2000

select.....from.. with... (INDEX=IX_TABLE_1, INDEX=IX_TABLE_2)... 

Je reçois l'erreur suivante

Une seule liste des indicateurs d'index par table est autorisé

Cela semble fonctionner correctement avec SQL Server 2005. Est-ce un problème avec SQL Server?

+0

J'ai fourni une explication plus détaillée pour vous. Indices d'index ne devraient vraiment être utilisés que rarement. (Bien qu'essayer différentes options et forcer temporairement des index spécifiques peut être un excellent outil d'apprentissage.) –

Répondre

2

I pense peut-être peut-être à cause de la syntaxe que vous utilisez.

au lieu de (INDEX = IX_TABLE_1, INDEX = IX_TABLE_2), essayez:

(INDEX=IX_TABLE_1, IX_TABLE_2) 

Je pense qu'il est le fait que vous avez 2 "INDEX =" parties.

En outre, je recommanderais d'utiliser uniquement des indices d'index en dernier recours car l'optimiseur de requête devrait généralement choisir le meilleur plan/index à utiliser. C'est pourquoi généralement, vous devriez faire confiance à l'optimiseur. Si vous utilisez des repères d'index, il est judicieux de les examiner assez fréquemment, car ils peuvent s'aggraver au fil du temps (par exemple, à mesure que les volumes de données augmentent, ce qui était initialement meilleur avec l'indice peut commencer à être pire).

+1

Merci! En fait, cela a fonctionné pour moi INDEX (IX_TABLE_1, IX_TABLE_2) – bdhar

-1

En fait, vous ne devriez pas donner des indices d'index en premier lieu.

Explication

  1. L'un des objectifs derrière le langage SQL est de séparer le « quoi » du « comment ». En d'autres termes; Vos requêtes devraient indiquer les règles des ensembles de résultats dont vous avez besoin et non les chemins d'accès aux données (ce que font exactement les indices).
  2. En liant vos requêtes à des index spécifiques, vous perdez la possibilité d'améliorer les performances en ajoutant de meilleurs index. C'est à dire. Vous devez également modifier vos requêtes.
  3. La plupart des options de conseil sont spécifiques à la plate-forme; vous réduisez la portabilité lorsque vous les utilisez.
  4. L'optimiseur de requête a été écrit pour prendre en compte tous les index, divers scénarios de jointure, et surtout; des informations statistiques sur les données dans vos tableaux. Même si vous êtes capable de couvrir vous-même toutes ces bases, et de déterminer les indices idéaux à utiliser aujourd'hui; dans 6 mois, la fréquence statistique de certaines valeurs, enregistrements, références dans votre base de données peut avoir changé - et votre sélection d'index peut ne plus être bonne!

Side Note

Si le optimser semble faire un choix stupide pour les index à utiliser; cela justifie généralement une enquête plus approfondie.

  • Comme première étape; Les statistiques de votre table sont-elles raisonnablement à jour?
  • Deuxièmement, assurez-vous que l'optimisateur ne renie pas un indice particulier parce que, en réalité, ledit indice réduit les performances. Par exemple, vous pourriez être tenté de faire une des opérations suivantes:

    SELECT Col1, Col2, Col3, ... 
    FROM Customers WITH (INDEX=IndexByName) 
    WHERE FistName LIKE 'A%' 
    
    SELECT Col1, Col2, Col3, ... 
    FROM Customers WITH (INDEX=IndexByName) 
    ORDER BY FirstName 
    

Les conseils d'index semblent parfaitement logique; cependant:

  • Si l'index est en cluster, ou un index de couverture: il serait utilisé de toute façon - sans l'indice.
  • Si l'index est non-cluster et non-couvert: des recherches de signets sont requises pour chaque enregistrement extrait. Cela entraîne une énorme quantité de frais généraux; en particulier sur l'activité de recherche de disque. Donc, par conséquent, les indices sont un mauvais choix après tout.

Enfin

Je ne suis pas sûr que ce soit le cas; mais votre question n'indique pas qu'il s'agit d'une requête multi-tables complexe. Donc, il peut en fait être aussi trivial que suit?

SELECT Col1, Col2, ... 
FROM ATable WITH (INDEX=Index1, INDEX=Index2) 

Quelle que soit la situation, il ne doute pas de sens à indice plusieurs index pour une table unique (à moins qu'il soit utilisé à plusieurs reprises avec l'auto-joint). Vous avez dit:

Cela semble bien fonctionner avec SQL Server 2005.

Et je dois demander: Êtes-vous sûr?
Je l'ai essayé; et autant que cela n'a pas causé un message d'erreur - il a sérieusement confondu l'optimiseur. Il a forcé l'optimiseur à traverser la même table deux fois (inutilement) et de joindre les ensembles de résultats les uns aux autres - encourant un énorme frais généraux !!

+0

pourquoi pas? Qu'est-ce que j'oublie ici?? – bdhar