Comparteix via


Agrupación en clústeres de datos en Fabric Data Warehouse

Esto se aplica a:✅ Almacén en Microsoft Fabric

La agrupación en clústeres de datos es una técnica que se usa para organizar y almacenar datos en función de la similitud. La agrupación en clústeres de datos mejora el rendimiento de las consultas y reduce los costos de acceso de proceso y almacenamiento para las consultas mediante la agrupación de registros similares.

Cómo funciona

La agrupación en clústeres de datos funciona almacenando filas con valores similares en ubicaciones adyacentes en el almacenamiento durante la ingesta. La agrupación en clústeres de datos usa una curva de relleno de espacio para organizar los datos de una manera que conserva la localidad entre varias dimensiones, lo que significa que las filas con valores similares en las columnas de agrupación en clústeres se almacenan físicamente cerca. Este enfoque mejora considerablemente el rendimiento de las consultas mediante la omisión de archivos y la reducción del número de archivos que se examinan.

A diferencia de la ordenación lexicográfica convencional, la agrupación en clústeres de datos usa un algoritmo sofisticado para ingerir, manteniendo las filas con valores de columna similares cerca, incluso cuando una tabla está agrupada por varias columnas. Esto hace que la agrupación en clústeres de datos sea ideal para consultas de rango, filtros de cardinalidad alta y tablas grandes con distribuciones sesgadas, lo que da lugar a lecturas más rápidas, E/S reducidas y un uso de recursos más eficaz.

Esta es una ilustración conceptual simplificada de la agrupación en clústeres de datos:

Diagrama que ilustra el concepto de agrupación en clústeres de datos en un almacenamiento de datos.

En este diagrama, una tabla etiquetada Source data muestra filas mezcladas y resaltadas en diferentes colores para representar agrupaciones en clústeres al destino. Una tabla Ordenada se divide en tres segmentos de archivo, cada una de las filas agrupadas por colores similares, lo que muestra cómo la agrupación en clústeres organiza los datos en segmentos de almacenamiento optimizados en función de los valores de columna.

Los metadatos de agrupación en clústeres de datos se insertan en el manifiesto durante la ingesta, lo que permite al motor de almacenamiento tomar decisiones inteligentes sobre qué archivos acceder durante las consultas de usuario. Estos metadatos, combinados con cómo se almacenan las filas con valores similares, garantizan que las consultas con predicados de filtro puedan omitir archivos completos y grupos de filas que se encuentran fuera del ámbito del predicado. Por ejemplo: si una consulta tiene como destino solo 10% de los datos de una tabla, la agrupación en clústeres garantiza que solo se examinen los archivos que contienen los datos dentro del intervalo del filtro, lo que reduce la E/S y el consumo de proceso. Las tablas más grandes se benefician más de la agrupación en clústeres de datos, ya que las ventajas de omitir archivos escalan con el volumen de datos.

Cuándo usar la agrupación en clústeres de datos

Al decidir si la agrupación en clústeres de datos podría ser beneficiosa, investigue los patrones de consulta y las características de la tabla en el almacenamiento. La agrupación en clústeres de datos es más eficaz cuando las consultas filtran repetidamente en columnas específicas y cuando las tablas subyacentes son grandes y contienen datos de cardinalidad de nivel medio a alto. Algunos escenarios comunes son:

  • Consultas repetidas con WHERE filtros: si la carga de trabajo incluye consultas frecuentes que filtran columnas específicas, la agrupación en clústeres de datos garantiza que solo se examinen los archivos pertinentes durante las consultas de lectura. Esto también se aplica cuando los filtros se usan repetidamente en paneles, informes o trabajos programados y se insertan en el motor de almacenamiento como instrucciones SQL.
  • Tablas más grandes: la agrupación en clústeres de datos es más eficaz cuando se aplica a tablas grandes en las que el examen del conjunto de datos completo es costoso. Al organizar filas con clústeres de datos, el motor de almacenamiento puede omitir todos los archivos y grupos de filas que no coinciden con el filtro de consulta, lo que puede reducir el uso de E/S y proceso.
  • Columnas de cardinalidad media a alta: las columnas con mayor cardinalidad (por ejemplo: columnas que tienen muchos valores distintos, como un identificador o una fecha) se benefician más de la agrupación en clústeres de datos porque permiten al motor aislar y colocar valores similares. Esto permite omitir archivos de forma eficaz, especialmente para consultas selectivas. Las columnas con cardinalidad baja (por ejemplo, género, región) por naturaleza tienen sus valores distribuidos entre más archivos, por lo que ofrecen oportunidades limitadas para omitir archivos.
  • Consultas selectivas con ámbito estrecho: cuando las consultas suelen tener como destino un pequeño subconjunto de datos y se combinan con un filtro WHERE, la agrupación en clústeres de datos garantiza que solo se lean los archivos que contienen las filas pertinentes.

La agrupación en clústeres de datos se produce automáticamente durante la ingesta de datos, independientemente de cómo se ingieren las filas. No se requiere ninguna operación de usuario después de ingerir datos para aplicar la agrupación en clústeres de datos.

Sintaxis DE CLUSTER BY

La agrupación en clústeres de datos se define durante la creación de la tabla mediante la CLUSTER BY cláusula . La sintaxis es la siguiente:

Sintaxis CREATE TABLE (Transact-SQL):

CREATE TABLE { warehouse_name.schema_name.table_name | schema_name.table_name | table_name } (
 [ ,... n ] –- Column list
) WITH (CLUSTER BY [ ,... n ]);

Create TABLE AS SELECT (Transact-SQL) sintaxis:

CREATE TABLE { warehouse_name.schema_name.table_name | schema_name.table_name | table_name } (
) WITH (CLUSTER BY[ ,... n ])
AS <select_statement>;

La CLUSTER BY cláusula requiere que se especifique al menos una columna para la agrupación en clústeres de datos y un máximo de cuatro columnas.

No se admite la creación de una tabla que use la agrupación en clústeres de datos con SELECT INTO .

Compatibilidad con tipos de datos

En la tabla siguiente se resumen los tipos de columna que se pueden usar en la CLUSTER BY cláusula :

Categoría Tipo de dato Soporte para la agrupación en clústeres de datos
Números exactos bit No
Números exactos bigint, int, smallint, decimal2, numeric
Números aproximados flota, real
Fecha y hora date, datetime2, time
Cadenas de caracteres1 char
Cadenas de caracteres1 varchar
Tipos de LOB varchar(max), varbinary(max) No
Cadenas binarias varbinary, uniqueidentifier No

1 Para los tipos de cadena (char/varchar), solo se usan los primeros 32 caracteres cuando se generan estadísticas de columna. Como resultado, las columnas con valores que contienen prefijos largos pueden tener ventajas limitadas con la agrupación en clústeres de datos.

2 Para los tipos decimales con una precisión superior a 18, los predicados no se empujan al almacenamiento al ejecutar la consulta. Si usa tipos decimales con agrupación en clústeres de datos, favorece las columnas con menor precisión.

Las columnas con tipos de datos no admitidos todavía pueden existir en una tabla que use la agrupación en clústeres de datos, pero no se pueden usar con CLUSTER BY.

Procedimientos recomendados para la agrupación en clústeres de datos

La agrupación en clústeres de datos es más eficaz cuando se eligen columnas de agrupación en clústeres en función de patrones de consulta reales, especialmente aquellos con cardinalidad media a alta y cuando se usan predicados de intervalo durante las consultas.

Tenga en cuenta los procedimientos recomendados siguientes al usar la agrupación en clústeres de datos:

  • La agrupación en clústeres de datos es más eficaz en tablas grandes.
  • Siempre que sea posible, procese la ingesta y las actualizaciones en lotes para manejar un mayor número de filas a la vez, en lugar de usar tareas más pequeñas. Para obtener un rendimiento óptimo, las operaciones DML deben tener al menos 1 millón de filas para beneficiarse de la agrupación en clústeres de datos. Después de inserciones, actualizaciones y eliminaciones consecutivas, la compactación de datos puede consolidar filas de archivos más pequeños en uno de tamaño óptimo.
  • Elija columnas con cardinalidad media a alta para la agrupación en clústeres de datos, ya que producen mejores resultados debido a su distribución de valor diferente. Las columnas con cardinalidad baja pueden ofrecer oportunidades limitadas para la eliminación de archivos.
  • Seleccione columnas en función del uso frecuente de WHERE predicados en paneles, informes, trabajos programados o consultas de usuario. Las condiciones de combinación de igualdad no se benefician de la agrupación de datos. Para obtener información general sobre cómo usar Query Insights para ayudar a elegir columnas para la agrupación en clústeres de datos en función de la carga de trabajo actual, consulte Tutorial: Uso de clústeres de datos en Fabric Data Warehouse.
  • No use la agrupación en clústeres de datos mediante más columnas de lo estrictamente necesario. La agrupación en clústeres de varias columnas agrega complejidad al almacenamiento, agrega sobrecarga y podría no ofrecer ventajas a menos que todas las columnas se usen juntas en consultas con predicados.
  • El orden de columna usado en CLUSTER BY no es importante y no cambia cómo se almacenan las filas.
  • Al crear una tabla con agrupación en clústeres de datos mediante CREATE TABLE AS SELECT (CTAS) o ingerir datos con INSERT INTO ... SELECT, mantenga la parte de selección de estas instrucciones lo más sencilla posible para lograr una calidad óptima de agrupación en clústeres de datos.

La agrupación en clústeres de datos puede reducir significativamente los costos durante las consultas, si están bien alineados con predicados de consulta. Sin embargo, la ingesta de datos incurre en más unidades de tiempo y capacidad (CU) en una tabla que usa la agrupación en clústeres de datos en comparación con una tabla equivalente con los mismos datos sin clústeres de datos. Esto sucede porque el motor de almacenamiento necesita ordenar datos durante la ingestión. Dado que los datos ingeridos se leen varias veces, la agrupación en clústeres de datos puede reducir el consumo general de proceso de una carga de trabajo determinada.

Vistas del sistema

Los metadatos de agrupación en clústeres de datos se pueden consultar mediante sys.index_columns. Muestra todas las columnas usadas en la agrupación en clústeres de datos, incluida la columna ordinal usada en la CLUSTER BY cláusula .

En la consulta siguiente se enumeran todas las columnas usadas en la agrupación en clústeres de datos en el almacenamiento actual y sus tablas:

SELECT
    t.name AS table_name,
    c.name AS column_name,
    ic.data_clustering_ordinal AS clustering_ordinal
FROM sys.tables t
JOIN sys.columns c
    ON t.object_id = c.object_id
JOIN sys.index_columns ic
    ON c.object_id = ic.object_id
   AND c.column_id = ic.column_id
WHERE ic.data_clustering_ordinal > 0
ORDER BY
    t.name,
    ic.data_clustering_ordinal;

Nota:

El ordinal de la columna solo se muestra como referencia para el orden utilizado en CLUSTER BY cuando se definió la tabla. Como se describe en Procedimientos recomendados, el orden de columnas no afecta al rendimiento.

Limitaciones y comentarios

  • El rendimiento de la ingesta de datos puede degradarse cuando las tablas contienen columnas varchar grandes con tamaños de datos muy variables.
    • Por ejemplo, considere una tabla con una columna varchar(200): si algunas filas contienen solo unos pocos caracteres, mientras que otras se aproximan a la longitud máxima, la varianza significativa en el tamaño de los datos puede afectar negativamente a la velocidad de ingesta.
    • Este problema se conoce y se solucionará en una próxima versión.
  • IDENTITY Las columnas no se pueden usar con CLUSTER BY. Las tablas que contienen una IDENTITY columna todavía se pueden usar para la agrupación en clústeres de datos, dado que usa columnas diferentes con CLUSTER BY.
  • La agrupación en clústeres de datos debe definirse en la creación de tablas. No se admite la conversión de una tabla normal en una con CLUSTER BY . Del mismo modo, no se permite modificar las columnas de agrupación en clústeres después de crear una tabla. Si se necesitan columnas de agrupación en clústeres diferentes, use CREATE TABLE AS SELECT opcionalmente (CTAS) para crear una nueva tabla con las columnas de agrupación en clústeres deseadas.
  • En algunos casos, es posible que la agrupación en clústeres de datos se aplique de forma asincrónica. En tales casos, los datos se reorganizan con una tarea en segundo plano y es posible que la tabla no esté totalmente optimizada cuando finalice la ingesta. Esto puede ocurrir en las condiciones siguientes:
    • Al usar INSERT INTO ... SELECT o CREATE TABLE AS SELECT (CTAS) y la intercalación de las tablas de origen y destino son diferentes.
    • Al ingerir datos externos que son de un formato CSV comprimido.
    • Cuando una instrucción de ingesta tiene menos de 1 millón de filas.
  • La ingesta de datos en tablas de agrupación en clústeres de datos incurre en una sobrecarga en comparación con una tabla con el mismo esquema que no usa la agrupación en clústeres de datos. Esto sucede debido a un cálculo adicional necesario para optimizar el almacenamiento. Cuando la columna de agrupamiento tiene una intercalación que no distingue mayúsculas de minúsculas, se espera una mayor sobrecarga.
  • La agrupación en clústeres de datos puede beneficiar el tiempo de respuesta de las consultas, el consumo de unidades de capacidad (CU) o ambos.

Examples

A. Crea una tabla agrupada para datos de ventas

En este ejemplo se crea una tabla Sales sencilla y se usan las columnas CustomerID y SaleDate para la vinculación de datos en clústeres.

CREATE TABLE Sales (
    SaleID INT,
    CustomerID INT,
    SaleDate DATE,
    Amount DECIMAL(10,2)
) WITH (CLUSTER BY (CustomerID, SaleDate))

B. Creación de una tabla en clúster mediante CREATE TABLE AS SELECT

En este ejemplo se usa CREATE TABLE AS SELECT para crear una copia de la Sales tabla existente, con CLUSTER BY la SaleDate columna .

CREATE TABLE Sales_CTAS 
WITH (CLUSTER BY (SaleDate)) 
AS SELECT * FROM Sales

C. Visualización de las columnas usadas para la agrupación en clústeres de datos en una tabla determinada

En este ejemplo se enumeran las columnas usadas para la agrupación en clústeres de datos de la Sales tabla.

SELECT
    c.name AS column_name,
    ic.data_clustering_ordinal AS clustering_ordinal
FROM sys.tables t
JOIN sys.columns c
    ON t.object_id = c.object_id
JOIN sys.index_columns ic
    ON c.object_id = ic.object_id
   AND c.column_id = ic.column_id
WHERE 
    ic.data_clustering_ordinal > 0
   AND t.name = 'Sales'
ORDER BY
    t.name,
    ic.data_clustering_ordinal;

Resultados:

Tabla que muestra las columnas de agrupación en clústeres y sus posiciones ordinales. En la primera fila se muestra CustomerID con ordinal 1 de agrupación en clústeres. La segunda fila enumera SaleDate con ordinal 2 de agrupación en clústeres.

D. Comprobación de la eficacia de las opciones de columna para la agrupación en clústeres de datos

Query Insights puede ayudar a evaluar el efecto de la agrupación en clústeres de datos en la carga de trabajo comparando el tiempo de CPU y los datos examinados entre una consulta determinada y su ejecución equivalente en una copia agrupada de la tabla original. En el ejemplo siguiente se muestra cómo recuperar el tiempo de CPU asignado y el volumen de datos examinados en disco, memoria y almacenamiento remoto para una consulta específica.

SELECT 
    allocated_cpu_time_ms, 
    data_scanned_disk_mb, 
    data_scanned_memory_mb, 
    data_scanned_remote_storage_mb
FROM 
    queryinsights.exec_requests_history 
WHERE 
     distributed_statement_id = '<Query_Statement_ID>'

Donde <Query_Statement_ID> es el identificador de instrucción distribuida de la consulta que desea evaluar.

Paso siguiente