powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Тяпничная Column-oriented dbms
25 сообщений из 60, страница 1 из 3
Тяпничная Column-oriented dbms
    #39235255
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет человеки.

Что нужно для создания своей in-memory Column-oriented dbms ? А именно - какие структуры
данных юзаются? Как организовываются связи между элементами колонок. Как идут
CRUD-операции?

В этом сабже я разбираюсь примерно как корова в балете. Можете писать смело основы.

Thnx.
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235329
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА именно - какие структуры данных юзаются? Как организовываются связи между
элементами колонок. Как идут CRUD-операции?
Массивы. Никак кроме как по общему индексу в массиве. Последовательно над всеми массивами
колонок.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235337
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, а insert/delete в принципе возможен для COEDBMS?

Или 1 раз залил и только читать ?
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235346
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаю все можно. В бусте даже заготовка есть boost::multi_index. MasterZiv недавно пример писал .
Добавь контроль целостности, блокировки при записи и будет полноценная in-memory СУБД
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235349
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты вроде sqlite осваивал. Если не путаю, там есть возможность создать in-memory БД
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235385
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задам другой вопрос. Правильно ли я понял что CODBMS всегда сортируют значения в колонках ?
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235497
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЗадам другой вопрос. Правильно ли я понял что CODBMS всегда сортируют значения в колонках ?
если честно - ХЗ.
С массивами все грустно. Постоянно сортировать - не быстро на больших таблицах. Вставка/удаление тоже не быстро. Если использовать массивы - то по аналогии работы с DBF: добавлять в конец, а вместо удаления пометка на удаление. Для режима readonly массивы предпочтительнее, при интенсивных изменениях - std::map.

Я микроБД делал на std::map. Индексы тоже std::map. Инфа не требующая долгосрочного хранения: учет залогиненных юзеров, сессии и еще кое-какие метаданные. При интенсивном изменении все быстро работает: и чтение и запись. ПсевдоБД из 2-3 таблиц с индексами и целостностью вполне просто реализовать. Правда с тремя уже сложно стало, так что при 3+ таблицах смотрел бы готовые решения типа sqlite, т.к. начинает просто не хватать стандартного SQL.
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235541
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЗадам другой вопрос. Правильно ли я понял что CODBMS всегда сортируют значения в колонках ?Нет сортирует не всегда, но всегда индексирует, а уже от нужд индексации, может и сортировка произойти :)
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235547
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlmaytonЗадам другой вопрос. Правильно ли я понял что CODBMS всегда сортируют значения в колонках ?Нет сортирует не всегда, но всегда индексирует, а уже от нужд индексации, может и сортировка произойти :)
А какой смысл индекс держать отдельно от данных если он всегда состоит из 1 поля? Колонка это и есть индекс
по отношению к самой себе. Я так себе принцип понимаю.

Но вопрос другой я делаю к примеру так:

Код: plaintext
1.
COEDBMS> select name,age from coedbmsTable where age between 10 and 30;


То я хочу не просто получить ages в диапазоне а я хочу получить связи. Тоесть и колонку name вместе.
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235553
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА какой смысл индекс держать отдельно от данных если он всегда состоит из 1 поля? Колонка это и есть индекс
индексов может быть (обычно есть) несколько. Если у тебя таблица из структур {A, B, C} то запрос может быть "... where A = XXX" и "... where В = XXX" тут физической сортировкой не порешать.
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235555
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНо вопрос другой я делаю к примеру так:
Код: plaintext
1.
COEDBMS> select name,age from coedbmsTable where age between 10 and 30;


То я хочу не просто получить ages в диапазоне а я хочу получить связи. Тоесть и колонку name вместе.
в чем проблема? Есть индекс по age, по нему извлекаются номера записей и все записи копируются в результат. Хотя если все в памяти, то достаточно указателей на записи. т.е. вопреки правилам так может быть быстрее
Код: plaintext
1.
select * from coedbmsTable where age between 10 and 30
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235600
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОК. Давайте я зайду с третьей стороны.

Есть учебная табличка. Dept

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SQL> select * from dept;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON



Прошу вас изобразить рисунком. Или презентацией. Или любым другим графическим тулзом.

Как? Каким образом CODBMS будет хранить в своей памяти эту табличку?

Для простоты - in-memory.
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235608
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonКаким образом CODBMS будет хранить в своей памяти эту табличку?

Код: sql
1.
2.
3.
int DEPYNO[] = {10,20,30,40};
char DNAME[20][] = {"ACCOUNTING", "RESEARCH", "SALES", "OPERATIONS" };
char LOC[20][] = {"NEW YORK", "DALLAS", "CHICAGO", "BOSTON" };


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235615
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, да но здесь нет сортировки по полю DNAME и LOC.
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235621
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonда но здесь нет сортировки по полю DNAME и LOC.
Насколько я знаю, column-ориентированность вовсе не подразумевает сортированность всего.
Это всего лишь формат хранения.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235622
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда я разочарован. Я просто искал структуру данных или хранения данных которая
позволяла-бы работать с таблицей так как будто у нее все поля всегда проиндексированы.

Мне казалось что это достижимо для CODBMS
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235623
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonМне казалось что это достижимо для CODBMS
Нет, их выигрыш исключительно на кучковании данных столбца.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235630
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну... я вот такой патчик накатил. Через двоеточие - ссылка на индекс.

Код: plaintext
1.
2.
char DNAME[20][] = {"ACCOUNTING:1", "OPERATIONS:4", "RESEARCH:2", "SALES:3",  };
char LOC[20][] = {"BOSTON:4", "CHICAGO:3", "DALLAS:2", "NEW YORK:1"};
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235664
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonТогда я разочарован. Я просто искал структуру данных или хранения данных которая
позволяла-бы работать с таблицей так как будто у нее все поля всегда проиндексированы.

Мне казалось что это достижимо для CODBMS

поясни - что и зачем ты хочешь делать по индексу (номеру/итератору) -
а) обращаться к полю в строке таблицы или
б) обращаться по номеру к конкретной строке таблицы
в) что-то третье (вычитывать подряд данные строк с 5 по 50 принадлежащие к 17-му столбцу)

Для реляционной теории первое не возбраняется (технически описание элементов отношения именами и уникальными номерами, имеющими характер атрибутов множества, эквивалентно ).
С практической точки зрения, климентские интерфейсы типа odbc естественным образом допускают обращение к элементам (полям) полученного набора данных по номерам.
, а второе с точки зрения теории не имеет смысла.
В практическом плане самые простые системы работы с данными вроде данных в формате dbf-III
естественным путем обеспечивают работу со строками по номерам.

Разница между строчным и колоночным хранением примерно такая - в первом случае некая непрерывная область памяти содержит набор строк, во втором случае непрерывная область памяти содержит данные одного столбца, относящиеся к множеству строк таблицы.

Первый заход ориентирован на эффективную горизонтальную фильтрацию (строк) за счет малого проигрыша в скорости вертикальной фильтрации - если из таблицы всегда выбираются селектом все поля отношения по условиям наложенным на каждое из них, и при этом в результат должно попасть лишь малое число строк, то строчное хранение победитель как самое быстрое.

А если из таблицы на 125 полей и триллион строк всегда выбирается лишь пара полей (узкая проекция широкой таблицы),
то в порядки раз быстрее два раза пробежаться по двум непрерывным областям хранения значений полей (вау -= параллельно пробежаться) чем перемолачивать гигатонны террабайт игнорируемых столбцов при строчном хранении.
В таком случае игнорируемые столбцы просто не будут прочитаны и потому не смогут создать никакой нагрузки фактом своего существования.
Зато Select * для column store - это простая, примитивного сорта (то есть - невыразимая словами) боль .

А зато если в лоб хранить column store в файлах по числу столбцов, да на каждый из них натравить zip, то ого-го какую экономию можно получить в размере базы данных, по сравнению со строчным хранением (говорят, что при инмемори компрешн втрое лучше
сжимать столбцами, чем строками), из-за однородности данных (дни рождения с днями рождения, сексуальные принадлежности с
сексуальными принадлежностями, коды территорий рядком с кодами территорий и т.п.)

Думаю, что для любого случая конкретной таблицы потребуется ее описатель, включающий в себя описатель полей (словарь полей)
(или набор описателей - если ты захочешь на уровне определения таблицы иметь множественное описание - именами и метками номеров (имена другого сорта - другой системы, с которыми при доп. договоренности можно обращаться как с числами).
Дальше, для строчного хранения, потребуется указатель на область памяти, с которой начинается хранилище строк.
Детали устройства строки на твое усмотрение - обязана она быть фиксированной длины или нет (если что-то чуть более "продвинутое" , чем dbf - то длину строки не фиксируют. Имеет право хотя бы иногда быть фрагментированной - то есть занимать несколько непрерывных диапазонов внутри логически сплошной области хранения строк или нет и т.д.

Описатель таблицы при колоночном хранении имеет не единственный указатель на начало области хранения содержимого таблицы, а столько указателей на наборы непрерывных областей, сколько столбцов в таблице - каждый столбец будет жить в своей непрерывной области памяти.
Если допускается формулировка связанных с таблицами индексов, то к описателю таблицы добавляется список описателей имеющихся индексов.

Если разглядывать Землю невооруженным глазом с границ Солнечной Системы, то примерно как-то так.
А по мере приближения к Земле, число различимых звездочек имеет право увеличиваться - сначала 3, потом 5.
Т.е. - детали всех алгоритмов - выборки, проекции и соединения не совпадают и специфичны для своего "способа хранения".

ps1
Прошу извинить за участие в топике - про C++ я в практическом плане ничего не знаю.

Ps2
не знаю что сейчас в базвордах по поводу колумн сторе.
Лет 10 назад было правильно гуглить по словам C-Store или MonetDB или Sybase IQ.
А сейчас какую только чертовщину этим словом не назовут.
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235665
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,
прошу простить опечатки.
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235733
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobymaytonТогда я разочарован. Я просто искал структуру данных или хранения данных которая
позволяла-бы работать с таблицей так как будто у нее все поля всегда проиндексированы.

Мне казалось что это достижимо для CODBMS

поясни - что и зачем ты хочешь делать по индексу (номеру/итератору) -
а) обращаться к полю в строке таблицы или
б) обращаться по номеру к конкретной строке таблицы
в) что-то третье (вычитывать подряд данные строк с 5 по 50 принадлежащие к 17-му столбцу)

ОК. Я польщен конечно что ты написал так много букв. Но можно было и короче. В режиме диалога.
Зайду с другой стороны. В 2007 году произошла некотороая маленькая тех. революция.
Поступили в продажу SSD-накопители. Что для нас, айтишников это означает? И что означает
для DBA-ев.

Изменяются принципы. Принципы проектирования хранилища данных. Для SSD существенно
улучшился SEEK_TIME, который косвенно связан со стоимостью IOPS. Индексное чтение
снова в фаворе. И оно очень выгодно.

Я рассуждаю так. Что low-level структуры данных должны это учитывать и более плотно
использовать возможности индексов. В идеале БД класса OLTP должна предполагать
быстрый доступ к данным в любой конфигурации запросов (клауза WHERE). А этого можно
достигнуть только имея индексы по каждой колонке а то и по группе колонок (составные).

Есть еще другие опции ускорения доступа такие как частичная материализация, сегментирование
и кластеризация группы таблиц вокруг ключа но мы их пока поскипаем ибо это уже не OLTP
а чуть сложнее.

Идеальная (на мой взгляд OLTP система) для таблички dept должна создаваться так:
Код: plsql
1.
2.
3.
4.
5.
create table dept(
 DEPTNO                                    NOT NULL NUMBER(2)
 DNAME                                              VARCHAR2(14)
 LOC                                                VARCHAR2(13)
);



Далее идут 3 скрипта на создание 3х индексов по каждому полю.

В этой схеме все хорошо кроме самой таблицы. Она не нужна. Вся информация уже есть в индексах.
Осталось только дополнить эти индексы связями для получения интерфейса курсора для выборки
всех (SELECT * ) полей.

Впрочем последний вариант - маловероятен ведь я изначально давлю на использование OLTP-mode.

(сорри убегаю отпишу продолжение позже)
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235743
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

мне кажется, что я приблизительно почувствовал, чего ты ищешь.
так же мне кажется, что в этом деле есть перпендикуляр.
то есть в наборе твоих суждений стоят как заходы, в которых ты скорее прав, так и заходы, в которых ты по вероятности не прав на текущий момент.
да, копаниями, рубаниями, отсечениями, дерзаниями и терзаниями на перпендикулярах что-то интересное создается.
в диковатой озвучке - некий всепольный супер-индекс как универсальная структура произвольного доступа по произвольно взятой комбинации полей.
также мне понятно, почему ты готов пожертвовать ценой восстановления экземпляра строки ради скорости поиска.
это да - column store специфически для этого, но !не для oltp! на сегодня.
типичный oltp это однострочный select -> update/insert -> comit
column store пытается выиграть на первой фазе, откровенно наплевав на вторую и третью.
что для oltp полностью неприемлемо.
column store и позиционируется и фактически применяется для data warehouse, где в online нет ни update/insert ни коммит.
сломать это может только волшебство, внезапно хотя бы приближающее insert/update/commit к временам, характерным для строчного хранения.

Вообще, пока будешь бегать, посмотри на устройство индекс-организованных таблиц.
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235758
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobyтакже мне понятно, почему ты готов пожертвовать ценой восстановления экземпляра строки ради скорости поиска.
Ну.. во первых это другая тема. Собственно WAL (write-ahead-log) или redo-log для Im-databases никто не отменяет.
И его формат вовсе не должен обязательно быть привязан к модели хранения в memory. Достаточно гарантировать
что при операциях insert/update/delete мы фиксируем на логическом уровне изменяющуюся сущность в логе.
Будет ли она приближена к формату хранения в memory или отдалена - это уже другой вопрос.

Но в данном конкретном случае я-бы хотел отвязаться от диска и обсудить как реализовать
БД моей мечты. Или БД в которой не будет потребности индексировать столбцы.
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235763
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton...Или БД в которой не будет потребности индексировать столбцы.
вероятно it's doable в каком-то виде.
во первых - внутри индекс-организованных полей структура совмещена - строки хранятся прямо в структуре индекса,
во вторых, если не идет речь многопользовательском варианте и совместном доступе, то первое, что приходит в голову
- некий граф поверх bitmap полей, кодирующих конечный словарный набор значений как разширение идеи индекс-организованной таблицы.
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235765
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,
внутри индекс-организованных полей таблиц
...
Рейтинг: 0 / 0
25 сообщений из 60, страница 1 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Тяпничная Column-oriented dbms
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]