2011-06-01 13 views
10

¿Hay alguna diferencia entre índice agrupado y orden por la cláusula?"índice agrupado" y "orden por cláusula"

Tengo que rellenar el menú desplegable de la tabla maestra y la siguiente es la consulta.

Select Id, Name from Table Order by Name 

¿Debo usar la Orden por la cláusula O índice agrupado para la tarea anterior?

EDITAR

A continuación se muestra el esquema de la tabla

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[lookup]') AND type in (N'U')) 
BEGIN 
CREATE TABLE [dbo].[lookup](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [Name] [varchar](50) NULL, 
CONSTRAINT [PK_lookup_ID] PRIMARY KEY NONCLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] 
) ON [PRIMARY] 
END 
GO 

IF NOT EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[lookup]') AND name = N'IX_lookup_Name') 
CREATE CLUSTERED INDEX [IX_lookup_Name] ON [dbo].[lookup] 
(
    [Name] ASC 
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] 

Tengo un índice agrupado en Name también. Pero ahora mismo no se muestra en el esquema. Lo siento, no sé por qué.

+0

Supongo que debe ordenar según el requisito (Id o Nombre). El nombre me parece el campo de orden correcto. –

Respuesta

15

Manzanas y naranjas. Un índice agrupado es una opción de almacenamiento. Una ORDEN POR es una opción de consulta. Si necesita resultados ordenados, el único forma de obtenerlos es agregar una cláusula ORDER BY a su consulta. Período.

Un índice puede ayudar al optimizador de consultas a generar un plan más eficiente y aprovechar el índice como un medio para satisfacer el requisito de ORDER BY. Pero de ninguna manera la presencia de un índice, agrupado o no agrupado, garantiza el ordenamiento de un resultado.

Así que absolutamente necesita ORDER BY en sus consultas. Usted también puede considerar un índice por Name columna para ayudar a este la consulta. Si se usará un índice o no, depende de muchos más factores. debe leer Designing Indexes y The Tipping Point.

+0

Lo siento, en caso de que use un índice agrupado en Name, garantiza mostrar el nombre en orden ascendente. Puedes probarlo también – Pankaj

+3

Puedo absolutamente asegurarle que está equivocado en su suposición. –

+0

Lo siento, probé esto mi final. Ordena los registros por Nombre en caso de que usemos el índice agrupado en Nombre – Pankaj

0

Si Id es su clave principal (es una situación común) y se usa en combinaciones, debe crear un índice agrupado en Id. Pero para buscar ganancia de rendimiento, debe crear un índice no agrupado en Name que incluirá Id.

+0

Estoy seleccionando tanto el Id como el Nombre sin la cláusula where – Pankaj

0

Un índice agrupado y una cláusula order by son dos cosas completamente diferentes. Un índice agrupado decide cómo se ordenan las filas en la tabla almacenada. Una cláusula order by decide cómo deben ordenarse los resultados de la consulta.

Un índice no agrupado crea otra "tabla de sombras" en el almacenamiento de base de datos, que se ordena en las columnas indexadas. También contiene la clave principal, para que pueda encontrar rápidamente la fila correcta en la tabla "real". Una práctica recomendada para el diseño de bases de datos es crear un índice agrupado en la clave principal (a menos que existan razones en contra). Cualquier otra columna que deba indexarse ​​se puede gestionar en índices no agrupados.

Para optimizar el rendimiento, es mucho más importante que las condiciones de la cláusula where puedan usar un índice que el orden por la lata.

+0

No estoy usando la cláusula where – Pankaj

0

Mi primera pregunta es: ¿Cuál es el caso de uso de negocio? Si la respuesta es "mostrar las filas en orden de nombre", entonces ORDER BY Name.

Dado que ya mencionó que ya tiene un índice no agrupado en Nombre, debería estar listo.

También me imagino que va a filtrar datos en 'Nombre' de todos modos, por lo que ya estará haciendo uso del índice.

Mi segundo pensamiento: ¿Estás optimizando prematuramente esto? ¿La mesa va a tener miles o millones de filas? De lo contrario, probablemente no se dará cuenta de si existe o no un índice. Y si tiene miles de filas, ¿qué tan bien se comportará la caja desplegable sin filtrar?

Podemos hacer muchas conjeturas, por lo que siempre es mejor si perfila las consultas en su entorno.

En general, coloca un ÍNDICE CLUSTERO en valores incrementales (IDENTIDAD, fechas de creación, etc.) o si los datos son relativamente estáticos. No todas las tablas requieren un índice agrupado.

1

Un índice permite una búsqueda rápida filtrando "DONDE CLÁUSULA" pero también tiene la ventaja añadida de que los datos serán ordenados.

ejemplo

Esto es cómo se guardan los datos en la tabla.

ID Name 
1  Jack 
2  Bob 
3  Jill 

Si agrega un índice agrupado en Nombre (ASC), esta es la forma en la que se guardará (claves primarias siempre se almacenan junto con cada indexado para mirar hacia arriba infomación)

2  Bob 
1  Jack 
3  Jill 

lo tanto la utilización de su SQL

Select Id, Name from Table Order by Name 

haga de un determinado sin el índice agrupado, la base de datos va a comprobar para ver si existe un índice que puede ayudar a hacer su trabajo más rápido. No encontrará ninguno, por lo que seleccionará los datos de la tabla, los clasificará y luego regresará.

Para seleccionar con el índice agrupado, la base de datos verificará si existe un índice que puede ayudar a hacer su trabajo más rápido. Encontrará el índice en el nombre que está ordenado ASC. Puede simplemente seleccionar la ID y el Nombre del índice, y luego regresar ya que sabe que los datos ya están ordenados.

Por lo tanto, sin el índice de nombre, la base de datos tiene que ordenar los datos cada vez que se ejecuta la consulta. Con el índice, el orden ocurre cuando los datos se insertan o se actualizan (lo que ralentiza las actualizaciones un poco) La diferencia es que solo necesita ordenar una vez y no todas.

+0

¿Hay algo así como, sin usar el orden por y solo tenemos índice agrupado para ordenar los datos? El sistema no garantiza ordenarlo? – Pankaj

+0

No estoy seguro de lo que está preguntando exactamente. Si solo tiene un índice agrupado y no hay orden por, eso dejaría la clave principal y el índice agrupado. Como el índice agrupado no daría ningún beneficio a la consulta, supondría que se usaría el escaneo en la tabla y se ignoraría el índice agrupado, lo que daría como resultado una selección que no se ordenaría. No estoy seguro de por qué no desea que la orden en la consulta, pero aún desea los resultados ordenados. Puede obligar a la consulta a usar el índice agrupado, pero esa no es la mejor manera de resolverlo. –

Cuestiones relacionadas