Nota
L'accés a aquesta pàgina requereix autorització. Pots provar d'iniciar sessió o canviar de directori.
L'accés a aquesta pàgina requereix autorització. Pots provar de canviar directoris.
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:
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
WHEREfiltros: 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 | Sí |
| Números aproximados | flota, real | Sí |
| Fecha y hora | date, datetime2, time | Sí |
| Cadenas de caracteres1 | char | Sí |
| Cadenas de caracteres1 | varchar | Sí |
| 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
WHEREpredicados 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 BYno 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 conINSERT 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.
-
IDENTITYLas columnas no se pueden usar conCLUSTER BY. Las tablas que contienen unaIDENTITYcolumna todavía se pueden usar para la agrupación en clústeres de datos, dado que usa columnas diferentes conCLUSTER 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, useCREATE TABLE AS SELECTopcionalmente (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 ... SELECToCREATE 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.
- Al usar
- 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:
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.