Almacenamiento en columnas - Amazon Redshift

Almacenamiento en columnas

El almacenamiento en columnas para tablas de bases de datos es un factor importante en la optimización del rendimiento analítico de consultas, porque reduce drásticamente los requisitos generales de E/S de disco. Esto reduce la cantidad de datos que necesita cargar del disco.

En la siguiente serie de ejemplos se describe cómo el almacenamiento de datos en columnas incorpora eficiencia y cómo eso se traduce en mejoras cuando se recuperan datos en la memoria.

En el primer ejemplo se muestra cómo los registros de las tablas de bases de datos suelen almacenarse por filas en los bloques del disco.

En una tabla de bases de datos relacionales típica, cada fila contiene valores de campo para un solo registro. En el almacenamiento de bases de datos en filas, los bloques de datos almacenan valores de forma secuencial en cada columna consecutiva que compone la fila completa. Si el tamaño del bloque es menor al tamaño de un registro, el almacenamiento de un registro completo puede ocupar más de un bloque. Si el tamaño del bloque es mayor al tamaño de un registro, el almacenamiento de un registro completo puede ocupar menos de un bloque, lo que se traduce en un uso ineficaz del espacio en disco. En las aplicaciones de procesamiento de transacciones online (OLTP), la mayoría de las transacciones con frecuencia incluyen la lectura y escritura de todos los valores de los registros completos, por lo general de a un registro o un número pequeño de registros a la vez. Como resultado, el almacenamiento en filas es óptimo para las bases de datos OLTP.

En el siguiente ejemplo se muestra cómo el almacenamiento en columnas guarda de forma secuencial los valores para cada columna en los bloques del disco.

Al usar el almacenamiento en columnas, cada bloque de datos almacena los valores de una sola columna para varias filas. A medida que los registros ingresan al sistema, Amazon Redshift convierte de forma transparente los datos en almacenamiento en columnas para cada una de las columnas.

En este ejemplo simplificado, mediante el almacenamiento en columnas, cada bloque de datos contiene valores de campo para hasta el triple de registros que los que contiene el almacenamiento basado en filas. Esto significa que la lectura del mismo número de valores de campo de las columnas para el mismo número de registros requiere un tercio de las operaciones de E/S en comparación con el almacenamiento en filas. En la práctica, la eficiencia de almacenamiento es aún mayor mediante la utilización de tablas con números de columnas muy grandes y una gran cantidad de filas.

Una ventaja agregada es que, dado que cada bloque contiene el mismo tipo de datos, los datos del bloque pueden utilizar un esquema de compresión seleccionado específicamente para el tipo de datos de las columnas, lo que reduce aún más la actividad de E/S y el espacio en el disco. Para obtener más información acerca de las codificaciones de compresión según los tipos de datos, consulte Codificaciones de compresión.

El ahorro de espacio para almacenar datos en el disco también lleva a la recuperación y posterior almacenamiento de esos datos en la memoria. Ya que muchas operaciones de bases de datos solo necesitan obtener acceso u operar a la vez en una columna o en un pequeño número de ellas, se puede ahorrar espacio en la memoria con solo recuperar los bloques para columnas que realmente se necesitan para una consulta. Cuando las transacciones OLTP normalmente incluyen la mayoría de las columnas o todas en una fila para un pequeño número de registros, las consultas de data warehouse por lo general leen solo algunas columnas para un número de filas muy grande. Esto significa que la lectura del mismo número de valores de campo de las columnas para el mismo número de filas requiere una fracción de las operaciones de E/S. Utiliza una fracción de la memoria que se necesitaría para procesar bloques por filas. En la práctica, la mejora en la eficacia es proporcionalmente mayor gracias a la utilización de tablas con números de columnas muy grandes y una gran cantidad de filas. Por ejemplo, suponga que una tabla contiene 100 columnas. Una consulta que utiliza cinco columnas solo necesitará leer alrededor del cinco por ciento de los datos contenidos en la tabla. El ahorro se repite posiblemente para miles de millones o incluso billones de registros de grandes bases de datos. En contraste, la base de datos en filas también leería los bloques que contienen las 95 columnas innecesarias.

Los tamaños típicos de los bloques de base de datos oscilan entre 2 KB y 32 KB. Amazon Redshift utiliza un tamaño de bloque de 1 MB, que es más eficiente y reduce aún más la cantidad de solicitudes de E/S necesaria para realizar cualquier carga de base de datos u otras operaciones que forman parte de la ejecución de consultas.