La orientación de los datos se refiere a cómo se representan los datos tabulares en un modelo de memoria lineal , como en disco o en memoria . Las dos representaciones más comunes son orientadas a columnas (formato columnar) y orientadas a filas (formato fila). [1] [2]
La elección de la orientación de los datos es una compensación y una decisión arquitectónica en bases de datos , motores de consulta y simulaciones numéricas. [1] Como resultado de estas compensaciones, los formatos orientados a filas se utilizan más comúnmente en el procesamiento de transacciones en línea (OLTP) y los formatos orientados a columnas se utilizan más comúnmente en el procesamiento analítico en línea (OLAP). [2]
Entre los ejemplos de formatos orientados a columnas se incluyen Apache ORC , [3] Apache Parquet , [4] Apache Arrow , [5] formatos utilizados por BigQuery , Amazon Redshift y Snowflake . Entre los ejemplos predominantes de formatos orientados a filas se incluyen CSV, formatos utilizados en la mayoría de las bases de datos relacionales , el formato en memoria de Apache Spark y Apache Avro . [6]
Los datos tabulares son de naturaleza bidimensional: los datos se representan en filas y columnas. Sin embargo, los sistemas operativos modernos representan lógicamente los datos en un modelo de memoria lineal , tanto en disco como en memoria. [7] [8] [9] Por lo tanto, una tabla en un modelo de memoria lineal requiere proyectar sus elementos bidimensionales en un espacio unidimensional. La orientación de los datos se refiere a la decisión tomada en esta proyección. Hay dos opciones destacadas de orientación: orientada a filas y orientada a columnas. [1] [2]
En la orientación por filas, los elementos de la tabla
se almacenan linealmente como
Es decir, cada fila de la tabla se ubica una después de la otra. En esta orientación, los valores de la misma fila están próximos en el espacio (por ejemplo, una dirección similar en un espacio direccionable).
En la orientación por columnas, los elementos de la tabla
se almacenan linealmente como
Es decir, cada columna de la tabla se ubica una después de la otra. En esta orientación, los valores de la misma columna están próximos en el espacio (por ejemplo, una dirección similar en un espacio direccionable).
Consulte la lista de DBMS orientados a columnas para obtener más ejemplos.
La orientación de los datos es una decisión arquitectónica importante de los sistemas que manejan datos porque da lugar a compensaciones importantes en cuanto a rendimiento y almacenamiento . [8] A continuación se presentan dimensiones seleccionadas de esta compensación.
La orientación por filas se beneficia del acceso aleatorio rápido a las filas. La orientación por columnas se beneficia del acceso aleatorio rápido a las columnas. En ambos casos, esto es el resultado de menos errores de página o caché al acceder a los datos. [8]
La orientación por filas se beneficia de la inserción rápida de una nueva fila. La orientación por columnas se beneficia de la inserción rápida de una nueva columna.
Esta dimensión es una razón importante por la que los formatos orientados a filas se utilizan más comúnmente en el procesamiento de transacciones en línea (OLTP), ya que da como resultado transacciones más rápidas en comparación con los formatos orientados a columnas. [2]
La orientación por filas se beneficia del acceso rápido bajo un filtro. La orientación por columnas se beneficia del acceso rápido bajo una proyección. [4] [3]
Los sistemas orientados a columnas se benefician de operaciones analíticas rápidas. Este es el resultado de poder aprovechar las instrucciones SIMD . [5]
La orientación por columnas se beneficia de un tamaño menor sin comprimir. Esto es el resultado de la posibilidad que ofrece esta orientación para representar ciertos tipos de datos con codificaciones dedicadas. [4] [3]
Por ejemplo, una tabla de 128 filas con una columna booleana requiere 128 bytes en un formato orientado a filas (un byte por booleano), pero 128 bits (16 bytes) en un formato orientado a columnas (a través de un mapa de bits). Otro ejemplo es el uso de codificación por longitud de ejecución para codificar una columna.
La orientación por columnas se beneficia de un tamaño comprimido más pequeño. Esto es el resultado de una mayor homogeneidad dentro de una columna que dentro de varias filas. [4] [3]
Dado que ambas orientaciones representan los mismos datos, es posible convertir un conjunto de datos orientado a filas en un conjunto de datos orientado a columnas y viceversa a expensas del cálculo. En particular, los motores de consulta avanzados a menudo aprovechan las ventajas de cada orientación y convierten de una orientación a la otra como parte de su ejecución. Como ejemplo, una consulta de Apache Spark puede