Как поиск дисков быстрее в столбцовой базе данных
Недавно я начал работать над большими запросами, я узнал, что они являются базой данных, ориентированной на столбцы, и в этом типе баз данных поиск дисков выполняется намного быстрее.
Может ли кто-нибудь объяснить мне, как поиск дисков быстрее в столбцово-ориентированной базе данных по сравнению с реляционными БД.
2 ответа
Большая разница в том, как данные хранятся на диске.
Давайте посмотрим на (более) упрощенный пример:
Предположим, у нас есть таблица с 50 столбцами, некоторые из которых являются числами (хранятся в двоичном виде), а другие имеют текст фиксированной ширины - с общим размером записи 1024 байта. Количество строк составляет около 10 миллионов, что дает общий размер около 10 ГБ - и мы работаем на ПК с 4 ГБ оперативной памяти. (хотя эти таблицы обычно хранятся в отдельных блоках на диске, для простоты мы будем предполагать, что данные хранятся в одном большом блоке).
Теперь предположим, что мы хотим суммировать все значения в определенном столбце (целые числа хранятся как 4 байта в записи). Для этого мы должны читать целое число каждые 1024 байта (наш размер записи).
Наименьшее количество данных, которые можно прочитать с диска, представляет собой сектор и обычно составляет 4 КБ. Таким образом, для каждого прочитанного сектора у нас есть только 4 значения. Это также означает, что для суммирования всего столбца мы должны прочитать весь файл размером 10 ГБ.
С другой стороны, в хранилище столбцов данные хранятся в отдельных столбцах. Это означает, что для нашего целочисленного столбца у нас есть 1024 значения в секторе 4096 байт вместо 4! (и иногда эти значения могут быть дополнительно сжаты). Общее количество данных, которые нам нужно прочитать, составляет около 40 МБ, а не 10 ГБ, и они также останутся в кеше диска для будущего использования.
Будет еще лучше, если мы посмотрим на кэш ЦП (при условии, что данные уже кэшированы с диска): одно целое число на каждые 1024 байта далеко от оптимального для кеша ЦП (L1), тогда как 1024 целых числа в одном блоке значительно ускорят вычисления. (они будут в кеше L1, который примерно в 50 раз быстрее обычного доступа к памяти).
"Поиск диска намного быстрее" не так. Реальный вопрос заключается в том, "как базы данных, ориентированные на столбцы, хранят данные на диске?", А ответ обычно - "только последовательными записями" (например, они обычно не обновляют данные на месте), и это приводит к меньшему количеству операций поиска на диске, отсюда и общее увеличение скорости