2010-12-03 38 views
6

Cómo seleccionar un índice SQLCómo seleccionar un índice SQL

Tengo una tabla con los campos TabEmp c_ID (primary key), y c_Emp_ID.

creé un índice en que idx_TabEmp (non-clustered) con los campos c_ID (primary key) y c_Emp_ID

estoy usando instrucción de selección

select * from index = idx_TabEmp 

Se genera un error

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 

estoy usando

select * from TabEmp (index = idx_TabEmp) 

funciona, pero no estoy seguro si esa es la forma correcta de seleccionar un índice

¿Puede decirme la forma correcta de consultar un índice?

+3

El optimizador debe usar el índice automáticamente si beneficia la consulta. Mire el plan de ejecución para determinar qué índice se está utilizando. –

+1

En SQL Server, no necesita/no suele especificar qué índice usar; el optimizador de consultas de SQL Server lo resolverá automáticamente. Simplemente haga su 'SELECT (lista de columnas) FROM (tablename)' y si el índice ayuda, SQL Server lo usará –

Respuesta

8

Esta es la sintaxis de una sugerencia de tabla.

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

en el servidor sql que creo que es su caso basado en su error.

En cuanto a si el índice se recogerá o no (tanto en el servidor de Oracle y sql) dependerá de muchas otras razones. Como su nombre indica, es solo una pista para el optimizador. El costo de la consulta usando la pista y sin la pista eventualmente serán los factores decisivos para el optimizador.

En la mayoría de los casos, no verá la necesidad de especificar la sugerencia. El optimizador usó esta ruta de acceso si usar el índice es la mejor manera de recuperar los datos y todos los metadatos (estadísticas) indican lo mismo.

+2

AFAIK siempre respetará la sugerencia incluso si conduce a un plan ridículo. p.ej. en AdventureWorks intente 'SELECT BirthDate FROM HumanResources.Employee WITH (ÍNDICE (IX_Employee_OrganizationLevel_OrganizationNode)) WHERE SickLeaveHours = 1' El NCI no contiene ni' BirthDate' ni 'SickLeaveHours' pero aún se usa. –

+0

Utilicé "SELECT * FROM table_name WITH (INDEX (index_name))" y estaba trabajando más rápido que "SELECT * FROM table_name". – Fransis

+0

Pero no estoy seguro de cómo dar permisos HINT en el administrador de SQL. – Fransis

8

El índice es algo que el optimizador recoge "automágicamente -. Lo ideal es que no es necesario forzar seleccionar un índice

Si realmente quiere forzar seleccionar el índice, utilice sugerencia de índice

SELECT * 
FROM TabEmp 
WITH (INDEX(idx_TabEmp)) 

Además, tenga en cuenta que sin condiciones de filtro (es decir, no hay WHERE cláusulas), el índice no entran en escena, ya que no está en busca de un dato específico -. todo lo que está seleccionando

Para proporcionar la analogía del libro, cuando está leyendo un libro completo de principio a fin, no necesita mirar el índice. Solo cuando busca una página específica observa el índice y encuentra lo que desea.

+0

I AMING SQL 2005. – Fransis

+1

El OP está en SQL Server (vea el mensaje de error en la pregunta) –

+1

Actualizado @Fransis @Martin – Sathya

Cuestiones relacionadas