¿Hay alguna ventaja de no particionar alineando un índice?

9

Tengo el privilegio de administrar una gran tabla OLAP particionada. Mientras revisaba esta tabla, noté que uno de los índices no está alineado con el esquema de partición. Como el autor no está disponible y las búsquedas de Google cuidadosamente elaboradas no han arrojado ningún resultado útil, no estoy seguro de si fue intencional o accidental.

¿Hay alguna razón para no particionar para alinear un índice en SQL Server 2008?

Robin
fuente
1
Posiblemente. Consulte el uso de estadísticas de índice para ver si se está utilizando ese índice. Si es así, use eventos extendidos o un rastreo del lado del servidor para capturar qué consultas están llegando a ese índice. Si funcionarían mejor en un índice alineado de partición, genial. De lo contrario, verifique si realmente necesitan índices particionados no alineados. Si no lo hacen, diría que la partición esté alineada de todos modos, ya que las consultas futuras pueden aprovecharla. Por supuesto, si el costo / esfuerzo / interrupción es demasiado alto, entonces no lo haga.
Ali Razeghi
Por lo que he leído, la mejor práctica para indexar una tabla particionada es alinear el índice con el esquema de partición. Esta tabla en particular me hizo pensar que quiero entender un caso de uso para no alinear un índice con el esquema de partición. No estoy tratando de resolver un problema específico, así que no tengo una consulta que deba analizarse.
Robin
Otra razón para diseñar un índice no alineado es un índice único (que incluye clave primaria o restricción única) que no incluye la columna de partición. En este caso, el índice no debe particionarse ni particionarse utilizando una función / esquema diferente.
Dan Guzman

Respuestas:

11

La principal ventaja de no particionar un índice (no única) en un objeto de base con particiones es que funciona alrededor de una limitación optimizador de consultas de larga data relacionada con las solicitudes de datos ordenados, tales como MIN, MAX, o TOP (n)consultas.

En un índice particionado, el optimizador generalmente no puede traducir MIN, MAXo TOP (n)a la misma operación por partición , seguido de un agregado global final sobre los agregados parciales por partición. En cambio, el optimizador elige un plan de ejecución que escanea todas las particiones del índice. La excepción a esto es el caso único donde la operación agregada o superior se especifica sobre la columna de partición.

Debo mencionar que también hay muy buenas razones para no tener índices no alineados. Elegir usar un índice no alineado tendría que ser una elección muy informada. Lo hice yo mismo (rara vez) en el pasado, pero en circunstancias muy específicas donde los beneficios claramente superaban los costos, o no había otra alternativa razonable.


Artículo de Itzik Ben-Gan explicando el problema.

Paul White 9
fuente
3

Existe el problema obvio en torno a algunas restricciones (por ejemplo, únicas) que requieren un índice no alineado.

Aparte de eso, los índices no alineados tienen un gran costo (principalmente evitan que muchos operadores paralelos vayan por subprocesos por partición y las alternativas son caras en memoria) y, por lo tanto, desaconsejaría encarecidamente dichos índices. Incluso con los casos enumerados por Paul, aún desaconsejaría los índices no alineados.

Remus Rusanu
fuente
1
Si. Elegir un índice no alineado debería ser una elección muy informada. Lo he hecho yo mismo (rara vez) en el pasado, pero en circunstancias muy específicas donde los beneficios superaron los costos.
Paul White 9
2

Los índices no alineados niegan el beneficio principal de la partición, que es el cambio de particiones. Si no depende de eso y está particionando por otras razones (almacenamiento diferente, particiones de solo lectura, estadísticas incrementales, ...), continúe y cree indexex no alineado.

Los índices no alineados son útiles porque puede imponer restricciones únicas en toda la tabla con ellos. Además, los índices no alineados no requieren que la clave de partición sea un prefijo de búsqueda implícito. Imagine tener 10000 particiones y consultas no basadas en la clave de partición. El plan de ejecución tendrá que buscar en 10000 particiones si el índice se alineó. Las otras respuestas tienen más ejemplos.

usr
fuente