tipos - sumar columnas calculadas sql
¿En qué columna debe colocarse el índice agrupado? (5)
Últimamente, he estado leyendo algunos índices de todos los tipos y el consejo principal es colocar el índice agrupado en la clave principal de la tabla, pero ¿qué sucede si la clave principal no se usa en una consulta (mediante un seleccionar o unirme? ) y se acaba de poner para fines puramente relacionales, por lo que en este caso no se consulta contra. Ejemplo: supongamos que tengo una tabla car_parts
y contiene 3 columnas, car_part_id
, car_part_no
y car_part_title
. car_part_id
es la columna de identidad de clave primaria única. En este caso, car_part_no
es único y lo más probable es car_part_title
. car_part_no
es lo que más se cuestiona, ¿no tiene sentido colocar el índice agrupado en esa columna en lugar de car_part_id
? Lo básico de la pregunta es: ¿qué columna debería tener realmente el índice agrupado ya que solo se le permite uno de ellos?
El índice agrupado debe ir a la columna que será la más consultada. Esto incluye combinaciones, ya que una combinación debe acceder a la tabla al igual que una consulta directa, y encontrar las filas indicadas.
Siempre puede reconstruir sus índices más adelante si su aplicación cambia y encuentra que necesita optimizar una tabla con una estructura de índice diferente.
Se pueden encontrar algunas pautas adicionales para decidir en qué agrupar su mesa en MSDN aquí: Pautas de diseño de índices agrupados .
El optimizador de consultas puede usar un índice, agrupado o no agrupado, solo si la clave más a la izquierda del índice está filtrada. Por lo tanto, si define un índice en las columnas (A, B, C), una condición WHERE en B=@b
, en C=@c
o en B=@b AND C=@c
no aprovechará al máximo el índice (ver nota ) Esto se aplica también a condiciones de unión. Cualquier filtro WHERE que incluya A
considerará el índice: A=@a
o A=@a AND B=@b
o A=@a AND C=@c
o A=@a AND B=@b AND C=@c
.
Por lo tanto, en su ejemplo, si establece el índice agrupado en part_no
como la clave más a la izquierda, una consulta que busque un part_id
específico no usará el índice y deberá existir un índice separado no agrupado en part-id
. De part-id
.
Ahora sobre la pregunta cuál de los muchos índices debería ser el agrupado . Si tiene varios patrones de consulta que tienen la misma importancia y frecuencia y se contradicen entre sí en términos de las claves necesarias (por ejemplo, consultas frecuentes por part_no
o part_id
), entonces tiene en cuenta otros factores:
- ancho : la clave de índice agrupado se utiliza como la clave de búsqueda por todos los demás índices no agrupados. Por lo tanto, si eliges una clave ancha (digamos dos columnas de unicidentificador), haces que todos los demás índices sean más amplios, lo que consume más espacio, genera más IO y ralentiza todo. Entonces, entre las teclas equaly good desde un punto de vista de lectura, elija la más estrecha como agrupada y haga que las más amplias no estén agrupadas.
- contención : si tiene patrones específicos de inserción y eliminación, intente separarlos físicamente para que ocurran en diferentes partes del índice agrupado. P.ej. si la tabla actúa como una cola con todas las inserciones en un extremo lógico y todas las elimina en el otro extremo lógico, intente distribuir el índice agrupado de modo que la orden física coincida con este orden lógico (por ejemplo, orden en secuencia).
- particionamiento : si la tabla es muy grande y planea implementar partición, entonces la clave de partición debe ser el índice agrupado. Un ejemplo típico son los datos históricos que se archivan utilizando un esquema de partición de ventana deslizante. Incluso si las entidades tienen una clave primaria lógica como ''entity_id'', el índice agrupado se realiza mediante una columna de fecha y hora que también se utiliza para la función de partición.
- estabilidad : una clave que cambia a menudo es una candidata pobre para una clave agrupada, ya que cada actualización actualiza el valor de la clave agrupada y obliga a todos los índices no agrupados a actualizar la clave de búsqueda que almacenan. Como una actualización de una clave agrupada también probablemente reubicará el registro en una página diferente, puede causar fragmentación en el índice agrupado.
Nota: no aprovecha al máximo, ya que a veces el motor elegirá un índice no agrupado para escanear en lugar del índice agrupado simplemente porque es más estrecho y, por lo tanto, tiene menos páginas para escanear. En mi ejemplo, si tiene un índice en (A, B, C) y un filtro WHERE en B=@b
la consulta proyecta C
, probablemente se usará el índice, pero no como una búsqueda, como un escaneo, porque todavía está más rápido que un escaneo en clúster completo (menos páginas).
Kimberly Tripp siempre es una de las mejores fuentes de información sobre indexación.
Vea su publicación en el blog "¡ Clave de agrupamiento cada vez mayor - el Debate del índice agrupado - otra vez! " En el que enumera y explica claramente los principales requisitos para una buena clave de agrupamiento - debe ser:
- Único
- Estrecho
- Estático
y lo mejor de todo, si puedes administrar:
- cada vez mayor
Teniendo todo esto en cuenta, una INT IDENTITY
(o BIGINT IDENTITY
si realmente necesita más de 2 mil millones de filas) resulta ser la mejor opción en la gran mayoría de los casos.
Una cosa que muchas personas no se dan cuenta (y por lo tanto no toman en cuenta al hacer su elección) es el hecho de que la clave de agrupamiento (todas las columnas que componen el índice agrupado) se agregará a cada índice entrada para todos y cada uno de los índices no agrupados en su tabla - por lo tanto, el requisito "estrecho" se vuelve muy importante.
Además, dado que la clave de clúster se utiliza para búsquedas de marcadores (al buscar la fila de datos reales cuando se encuentra una fila en un índice no agrupado), el requisito "único" también se vuelve muy importante. Tan importante, de hecho, que si elige un (conjunto de) columna (s) que no se garantiza que sean únicos, SQL Server agregará un únicofier de 4 bytes a cada fila -> haciendo que cada uno de sus teclas de índice agrupadas extra anchas; definitivamente NO es algo bueno.
Bagazo
Los índices agrupados son buenos cuando consultas rangos de datos. Por ejemplo
SELECT * FROM theTable WHERE age BETWEEN 10 AND 20
El índice agrupado organiza las filas en el orden particular en el disco de su computadora. Es por eso que las filas con edad = 10 estarán una junto a la otra, y después de ellas habrá filas con edad = 11, etc.
Si tiene selección exacta, haga lo siguiente:
SELECT * FROM theTable WHERE age = 20
el índice no agrupado también es bueno. No reorganiza los datos en el disco de su computadora, pero construye un árbol especial con punteros a las filas que necesita.
Por lo tanto, depende en gran medida del tipo de consultas que realice.
Tenga en cuenta los patrones de uso; Si casi siempre está consultando el DB en el car_part_no, entonces probablemente sería beneficioso agruparlo en esa columna.
Sin embargo, no te olvides de las uniones; Si la mayoría de las veces te estás uniendo a la mesa y la unión usa el campo car_part_id, entonces tienes una buena razón para mantener el clúster en car_part_id.
Algo más a tener en cuenta (menos en este caso, pero generalmente cuando se consideran índices agrupados) es que el índice agrupado aparecerá implícitamente en cualquier otro índice en la tabla; Entonces, por ejemplo, si tuviera que indexar car_part_title, ese índice también incluirá car_part_id implícitamente. Esto puede afectar si un índice cubre una consulta o no y también afecta la cantidad de espacio en disco que tomará el índice (lo que afecta el uso de la memoria, etc.).