Disminuye el rendimiento de SQL Server cuando ejecuta una superior, MAX o MIN Agregar cláusula en columnas distintas de la columna de partición

Síntomas

Se supone que se disponen de tablas con particiones en Microsoft SQL Server. Al ejecutar un principio, MAX o MIN Agregar cláusula en las columnas de las tablas, puede experimentar disminución del rendimiento.

Nota: Este problema sólo ocurre en la columna de partición.

Solución alternativa

Para evitar este problema, crear una consulta que recopila los elementos N de la parte superior de cada partición. A continuación, busque los elementos de TOP N de esa colección de elementos.

Por ejemplo, que tiene una tabla T1 que tiene cuatro particiones, y la función de partición es PF1. La tabla tiene particiones en la columna PCOL y tiene el índice idx_c1 en T1.c1. Puede encontrar el problema de rendimiento al ejecutar la consulta siguiente:

SELECT TOP 3 T1.c1, T1.c2
FROM dbo.T1

ORDER BY T1.c1


Para evitar este problema, siga estos pasos:

  1. Buscar los primeros 3 elementos de una partición dada <número_partición>:

    SELECT TOP 3 T1.c1, T1.c2                FROM dbo.T1
    WHERE $PARTITION.PF1(PCOL) = <
    partition_number> AS A(c1, c2) ORDER BY T1.c1;
  2. Encontrar los 3 primeros elementos de todas las cuatro particiones:

    SELECT TOP 3 A.c1, A.c2FROM (VALUES((1),(2),(3),(4)) AS P( partition_number )
    CROSS APPLY ( SELECT TOP 3 (T1.c1, T2.c2)
    FROM dbo.T1
    WHERE $PARTITION.PF1(T1.PCOL) = P.partition_number
    ORDER BY T1.c1 ) AS A
    ORDER BY A.c1
  3. Desgraciadamente, si se reparte la tabla, deberá escribir estas consultas para poder utilizar el nuevo número de particiones. Sin embargo, también puede obtener el número de particiones de sys.partitions. Por lo tanto, en lugar de utilizar una lista de constante de particiones, puede utilizar la siguiente secuencia de comandos de SQL:

    SELECT TOP 3 A.c1, A.c2FROM  sys.partitions AS P
    CROSS APPLY ( SELECT TOP 3 T1.c1, T2.c2)
    FROM dbo.T1
    WHERE $PARTITION.PF1(T1.col1) = P.partition_number
    ORDER BY T1.c1 ) AS A
      WHERE P.object_id = OBJECT_ID('dbo.T1')  
      AND P.index_id = INDEXPROPERTY( OBJECTID('dbo.T1'), 'idx_c1', 'INDEXID')
    ORDER BY a;


Nota: En este artículo utiliza TOP N con un pedido por cláusula como en el ejemplo. Cláusulas de MAX y MIN tienen problemas similares. Por lo tanto, se puede trabajar alrededor convirtiéndolos en consultas TOP 1 , con el orden establecido en ascendente o descendente.

Más información

Cuando utiliza una consulta para la fila N de la parte superior de una columna indizada en una tabla sin particiones, generalmente la consulta tiene un rendimiento muy bueno. Esto es porque el plan de consulta explora un índice para determinar cuáles son los n primeros elementos.

Sin embargo, para una tabla con particiones, esto actualmente no es el caso, como los índices también se pueden particionar. Esto significa que simplemente no se pueden consultar los índices para determinar los N primeros elementos. Esos elementos pueden distribuirse a través de todas las particiones. Por ejemplo, considérese el siguiente caso en el que tiene una tabla "a" con dos particiones P0 y P1 se particionan alrededor de 0:

Partición

Clave

Valor

P0

-2

1

P0

-1

1

P0

0

12

P1

1

1

P1

2

1

P1

3

15


Dado que cada índice está particionado, SQL Server no puede analizar el índice de todo al mismo tiempo para determinar el valor máximo. En su lugar, analiza cada elemento de la tabla para determinar el valor máximo. En una tabla con millones de filas, este proceso puede ser muy ineficaz.

Estado

Microsoft ha confirmado que se trata de un problema de los productos de Microsoft que se enumeran en la sección "Aplicable a".

¿Necesita más ayuda?

Ampliar sus conocimientos
Explorar los cursos
Obtener nuevas características primero
Unirse a Microsoft Insider

¿Le ha sido útil esta información?

¡Gracias por sus comentarios!

Gracias por sus comentarios. Quizá le interese ponerse en contacto con uno de nuestros agentes de soporte de Office.

×