Ориентация данных относится к тому, как табличные данные представлены в линейной модели памяти , например, на диске или в памяти . Два наиболее распространенных представления — это ориентированные на столбцы (столбчатый формат) и ориентированные на строки (строчный формат). [1] [2]
Выбор ориентации данных — это компромисс и архитектурное решение в базах данных , механизмах запросов и численном моделировании. [1] В результате этих компромиссов форматы, ориентированные на строки, чаще используются в онлайн-обработке транзакций (OLTP), а форматы, ориентированные на столбцы, чаще используются в онлайн-аналитической обработке (OLAP). [2]
Примерами столбчато-ориентированных форматов являются Apache ORC , [3] Apache Parquet , [4] Apache Arrow , [5] форматы, используемые BigQuery , Amazon Redshift и Snowflake . Преобладающими примерами строко-ориентированных форматов являются CSV, форматы, используемые в большинстве реляционных баз данных , формат в памяти Apache Spark и Apache Avro . [6]
Табличные данные двумерны по своей природе — данные представлены в строках и столбцах. Однако современные операционные системы логически представляют данные в линейной модели памяти , как на диске, так и в памяти. [7] [8] [9] Поэтому таблица в линейной модели памяти требует проецирования своих двумерных элементов в одномерное пространство. Ориентация данных относится к решению, принятому в этой проекции. Существует два основных варианта ориентации: ориентированная на строки и ориентированная на столбцы. [1] [2]
В строковой ориентации элементы таблицы
хранятся линейно как
Т.е. каждая строка таблицы расположена одна за другой. При такой ориентации значения в одной строке находятся близко в пространстве (например, одинаковый адрес в адресуемом пространстве).
В столбчатом формате элементы таблицы
хранятся линейно как
Т.е. каждый столбец таблицы расположен один за другим. При такой ориентации значения в одном столбце находятся близко в пространстве (например, одинаковый адрес в адресуемом пространстве).
Дополнительные примеры см . в списке столбчато-ориентированных СУБД .
Ориентация данных является важным архитектурным решением систем, обрабатывающих данные, поскольку она приводит к важным компромиссам в производительности и хранении . [8] Ниже приведены избранные аспекты этого компромисса.
Строчно-ориентированный выигрывает от быстрого случайного доступа к строкам. Столбчато-ориентированный выигрывает от быстрого случайного доступа к столбцам. В обоих случаях это является результатом меньшего количества промахов страниц или кэша при доступе к данным. [8]
Строчно-ориентированный выигрывает от быстрой вставки новой строки. Столбчато-ориентированный выигрывает от быстрой вставки нового столбца.
Это измерение является важной причиной того, почему форматы, ориентированные на строки, чаще используются в онлайн-обработке транзакций (OLTP), поскольку они обеспечивают более быстрые транзакции по сравнению с форматами, ориентированными на столбцы. [2]
Строчно-ориентированный выигрывает от быстрого доступа под фильтром. Столбчато-ориентированный выигрывает от быстрого доступа под проекцией. [4] [3]
Преимущества, связанные с колонками, от быстрых аналитических операций. Это результат возможности использовать инструкции SIMD . [5]
Столбцово-ориентированный выигрывает от меньшего несжатого размера. Это результат возможности, которую эта ориентация предлагает для представления определенных типов данных с выделенными кодировками. [4] [3]
Например, таблица из 128 строк с булевым столбцом требует 128 байт в формате, ориентированном на строку (один байт на булево значение), но 128 бит (16 байт) в формате, ориентированном на столбец (через битовую карту). Другим примером является использование кодирования длины серии для кодирования столбца.
Колонка-ориентированная выигрывает от меньшего сжатого размера. Это результат более высокой однородности внутри колонки, чем внутри нескольких строк. [4] [3]
Поскольку обе ориентации представляют одни и те же данные, можно преобразовать набор данных, ориентированный на строки, в набор данных, ориентированный на столбцы, и наоборот за счет вычислений. В частности, расширенные механизмы запросов часто используют преимущества каждой ориентации и преобразуют одну ориентацию в другую в ходе выполнения. Например, запрос Apache Spark может