2010-12-03 5 views
6

Comment sélectionner un index sqlComment sélectionner un index sql

J'ai une table TabEmp avec des champs c_ID (primary key) et c_Emp_ID.

J'ai créé un index sur ce idx_TabEmp (non-clustered) avec les champs c_ID (primary key) et c_Emp_ID

J'utilise instruction select

select * from index = idx_TabEmp 

Il renvoie une erreur

Incorrect syntax near 'index'. If this is intended as a part of a table hint, A WITH keyword and parenthesis are now required. See SQL Server Books Online for proper syntax 

J'utilise

select * from TabEmp (index = idx_TabEmp) 

cela fonctionne, mais je ne suis pas sûr si c'est la bonne façon de choisir un index

Pouvez-vous s'il vous plaît me dire la bonne façon d'interroger un index?

+3

L'optimiseur doit utiliser l'index automatiquement s'il bénéficiera à la requête. Regardez le plan d'exécution pour déterminer quel index est utilisé. –

+1

Dans SQL Server, vous n'avez généralement pas besoin de spécifier l'index à utiliser - l'optimiseur de requêtes de SQL Server le calculera automatiquement. Faites simplement votre 'SELECT (liste de colonnes) FROM (nom_table)' et si l'index vous aide, SQL Server l'utilisera –

Répondre

8

Ceci est la syntaxe d'un indicateur de table.

SELECT column_list FROM table_name WITH (INDEX (index_name) [, ...]); 

dans le serveur de SQL que je pense est votre cas basé sur votre erreur.

La question de savoir si l'index sera détecté ou non (à la fois dans le serveur Oracle et le serveur SQL) dépendra de beaucoup d'autres raisons. Comme son nom l'indique, il s'agit simplement d'un indice pour l'optimiseur. Le coût de la requête en utilisant l'indice et sans l'indice sera finalement les facteurs décisifs pour l'optimiseur.

Dans la plupart des cas, vous ne verrez pas la nécessité de spécifier l'indicateur. L'optimiseur utilisé ce chemin d'accès si l'utilisation de l'index est le meilleur moyen de récupérer les données et toutes les métadonnées (statistiques) indiquent la même chose.

+2

AFAIK il respectera toujours l'indice même s'il conduit à un plan ridicule. par exemple. dans AdventureWorks, essayez 'SELECT BirthDate FROM HumanResources.Employee WITH (INDEX (IX_Employee_OrganizationLevel_OrganizationNode)) OERE SickLeaveHours = 1' Le NCI ne contient ni' BirthDate' ni 'SickLeaveHours' mais est toujours utilisé. –

+0

J'ai utilisé "SELECT * FROM nom_table WITH (INDEX (nom_index))" et travaillait plus vite que "SELECT * FROM nom_table". – Fransis

+0

Mais je ne suis pas sûr de savoir comment donner des permissions HINT dans l'administrateur SQL. – Fransis

8

L'indice est quelque chose que l'optimiseur prend « automagiquement -. Idéalement, vous n'avez pas besoin de forcer sélectionner un index

Si vous voulez vraiment forcer sélectionner l'index, utilisez indice d'index

SELECT * 
FROM TabEmp 
WITH (INDEX(idx_TabEmp)) 

en outre, notez que sans conditions de filtre (pas de clauses WHERE), l'indice ne vient pas dans l'image, puisque vous ne recherchez pas une donnée spécifique -. vous tout sélectionner

Pour fournir l'analogie du livre - lorsque vous lisez un livre complet à couvrir - vous n'avez pas besoin de regarder l'index. C'est seulement lorsque vous recherchez une page spécifique que vous regardez l'index et trouvez ce que vous voulez.

+0

I AM USING SQL 2005. – Fransis

+1

L'OP est sur SQL Server (voir le message d'erreur dans la question) –

+1

Mis à jour @Fransis @Martin – Sathya