powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Тяпничная Column-oriented dbms
60 сообщений из 60, показаны все 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
Тяпничная Column-oriented dbms
    #39235768
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby- некий граф поверх bitmap полей, кодирующих конечный словарный набор значений как разширение идеи индекс-организованной таблицы.
Sorry. Я это вообще не понял.
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235772
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

погугли (дополнительно к индекс-организованным таблицам) "oracle bitmap index structure"
что-нибудь вроде доки или здесь посмотри - www.juliandyke.com/Presentations/BitmapIndexInternals.pp

bitmap-индекс это попытка обеспечить быстрый доступ (в том числе по комбинации) для полей, у которых набор значений в домене мал, а число строк, хранящих эти значения - огромно, путем кодирования в битмап-полях идентификаторов строк, в которых появляется то или иное значение/комбинация.
В части скорости доступа к по настоящему большим наборам данных при строчном хранении - штука фантастическая, в обмен на жертвы в части совместной доступности таблиц для изменений и сжирание процессора до степени каления.
во всяких, близких по объемам к настоящим, хранилищах поверх oracle database без этого вантуза не живут
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235774
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby, я в общих словах знаю как работает bitamp-индекс. Но его сфера применения ограничена.
Это поля с невысокой кардинальностью а также комбинации этих полей.

Но я не понимаю каким образом эти знания соотносятся с тем примером что я приводил.

Типичный запрос на выборки значений в диапазоне (index-scan):

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



Я рассматриваю generic database где у меня изначально нет иформации о
том какие будут поля. Но я точно знаю что возможен (!) запрос по любому
этому полю и по комбинации этих полей, а также запросы на "больше", "меньше"
и запросы на IS NULL / IS NOT NULL
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235783
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Марк, а что значит column-oriented? Вы имеете ввиду sql и nosql?
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235793
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
про восстановление, похоже, ты меня неправильно понял - я не про логи, восстановление и целостность говорил совсем.
вот твоя колоночная таблица
coedbmsTable:
name[Varchar2(100)] = {Маша,Вася, Вася, Петя, Федя, Ира, Паша, Витя, Саша, Галя, Валя}
age[Number(3)] = {10 ,40 ,65 , 34 , 25 , 42 , 38 , 56 , 57 , 18 , 31 }

вот запрос:
select name,age from coedbmsTable where age between 10 and 30

вот результат, который вернул твой поиск:
name[Varchar2(100)] = {Маша, Федя, Галя}
age[Number(3)] = {10 , 25 , 18 }

а клиенту, ты хочешь (можешь хотеть) отдать
{{name, age}
{Маша, 10},
{Федя, 25},
{Галя, 18}
}

то есть преобразовать результат из колоночного преставления в вариант строчного.
то есть восстановить строки из колонок - в этом смысле.
и в этой логике нет никаких хранимых идентификаторов строк.
------------------------------
- по поводу остального
ты говоришь примерно следующее (я так тебя понимаю):
1) индекс позволяет а) осуществить поиск значения строки за логарифмическое время и б) автоматически поддерживают сортировку по возрастанию-убыванию значений. гут - хочу - пусть у меня хранение каждой колонки будет в виде индексного дерева.
т.е. если в базе два Васи и одна Маша, то получится что-то такое
{Вася:32CEA158B6D90409E0530820A8C012BB, Вася:32CEA158B6D90409E0530820A8C013BB,
Маша:32CEA158B6D90409E0530820A8C011BB}
или такое
{Вася:{32CEA158B6D90409E0530820A8C012BB,32CEA158B6D90409E0530820A8C013BB},
Маша:32CEA158B6D90409E0530820A8C011BB}
здесь Васю сжали для экономии места, но без задействования битмап-карт

2) тогда сама таблица выродится в набор идентификаторов строк (rid/rowid/"номеров_строк" - guid), к которым и будут привязаны
хранимые в индексе значения,а хранить его тоже в индексе, чтобы быстро добираться до идентификатора строки по его значению.

3) а чтобы восстановить строку по условию name='Maша' (Маша - уникальна) я полезу в столбец name
и по ключу 'Маша' отыщу хранимый в индексе идентификатор строки, найду в индексе
{'Маша:32CEA158B6D90409E0530820A8C011BB'},
далее, т.к. просили меня Select *, то используя уже '32CEA158B6D90409E0530820A8C011BB' я полезу в индексы, обратные к
виду {ключ=значение_поля, значение = идентификатор строки таблицы}
индексирующие сами идентификаторы строк, вида
{{32CEA158B6D90409E0530820A8C011BB:10}}, каждый из которых будет уникальным.
В простом случае даже можно себе представить что такой "обратный", "восстанавливающий" индекс - один - общий на все столбцы.
и имеет вид
{{32CEA158B6D90409E0530820A8C011BB:{name='Маша',age=10}}
(но это есть строчное представление в конечном счете)
Т.е. в такой системе хранимые значения задвоятся, а идентификаторы строк размножатся по числу полей.

битмап здесь при том, что число имен людей и и мощность множества их возрастов, выраженная в годах,
много меньше числа людей и может появиться желание перейти к более компактному представлению по отношению даже к сжатому
Вася:{32CEA158B6D90409E0530820A8C012BB,32CEA158B6D90409E0530820A8C013BB}
фиксируя местоположения идентификаторов встречающихся строк с именем Вася в некоторой битовой карте представляющей
разом все множество наличных строк.

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

как-то так я увидел твои намерения.
И задачу сформулировал бы так:

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

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

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


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

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

Здесь описана пока идея. Отображение таблицы dept см. выше на in-memory model.

Овалами обзначены поля. Стрелками - указатели. В виде Red/Black деревьев - индексы.
data-row представляет собой однонаправленный список из атомов. Поскольку последний
элемент содержит бесполезный указатель - я его просто завернул на первый элемент.
Надеюсь эта малая оптимизация позволит выбирать быстрее выборочно несколько колонок.
Например первую и последнюю. Корневыми вершинами в этой сети являются корни индексов.
Собственно итератора по таблице нет. Его заменяет обход любого индекса. В зависимости
от его выбора мы получаем разный способ сортировки.

Что еще я не решил:
1) Как представлять null
2) Как делать DML операции
3) Как быть с типами данных (пока все - строки)
4) Как делать комбинацию сразу двух индексов оптимально если выражение WHERE содержит таковые.
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235836
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ей аналог в Oracle:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create table DEPT(
 DEPTNO NUMBER(2) PRIMARY KEY
 DNAME VARCHAR2(14)
 LOC VARCHAR2(13)
);
-- индекс по PK Создается автоматически по полю DEPTNO 

create index DEPTNO_INDX on DEPT(deptno);

create index LOC_INDX on DEPT(loc);
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235849
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ просто искал структуру данных или хранения данных которая позволяла-бы работать с таблицей так как будто у нее все поля всегда проиндексированы.

Мне казалось что это достижимо для CODBMS
Извиняюсь, вчера не понял о чем речь. ИМХУ теже яйца только в профиль. Тут сразу возникает проблема: выбрали быстро нужные элементы из одного столбца и получили проблему как выбрать сопутствующие значения из остальных столбцов. Нужен отдельный индекс по каждому столбцу (номер записи - значение), т.е. от чего ушли (доп индексы) к тому и пришли. Плюс разве что в том, что если из 100 столбцов надо 3-4, то будут обработаны 3-4. Но как правило в нормализованных таблицах нет 100 столбцов и нужны если не все, то почти все. Т.е. тупик.
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235851
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TИзвиняюсь, вчера не понял о чем речь. ИМХУ теже яйца только в профиль. Тут сразу возникает проблема: выбрали быстро нужные элементы из одного столбца и получили проблему как выбрать сопутствующие значения из остальных столбцов. Нужен отдельный индекс по каждому столбцу (номер записи - значение), т.е. от чего ушли (доп индексы) к тому и пришли.
Я видимо не до конца нарисовал. Все индексы по всем столбцам есть. Изначально.
Вся база данных - это суть - паутина индексов. Таблицы как таковой нет. Она - метафора.
Связный список нескольких атомов. А учитывая мою модель у нас нет дубляжа ключей.
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235852
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПлюс разве что в том, что если из 100 столбцов надо 3-4, то будут обработаны 3-4. Но как правило в нормализованных таблицах нет 100 столбцов и нужны если не все, то почти все. Т.е. тупик.
По поводу 100 столбцов. Ты мне подкинул мысль. Наверное список атомов в data-row должен
быть двухсвязным чтобы листать от 99-го поля к 30-му к примеру. Тоесть проще обходить против
часовой стрелки.

Или вообще сделать скип-список. Прыгать не через 1 а через 2 элемента.... правда это
все требует моделирования чтоб оценить потери на сторедже... так даже не могу прикинуть.
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235855
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ видимо не до конца нарисовал. Все индексы по всем столбцам есть. Изначально.
Вся база данных - это суть - паутина индексов. Таблицы как таковой нет. Она - метафора.
Связный список нескольких атомов. А учитывая мою модель у нас нет дубляжа ключей.
Я это понял. Потому и написал нужен индекс индекса. Например таблица
RowNameAge1Вася102Петя83Коля14
Превратится в
Код: plaintext
1.
Name = (Bacя,1);(Коля,3);(Петя,2)
Age = (8,2);(10,1);(14,3)
Допустим надо выбрать select Name where Age = 14
тут быстро нашли что Row = 3 а дальше надо искать в Name где Row == 3, т.е. или перебор или надо индекс. Вот я к чему. Если полей много, то по каждому надо искать, т.е. еще доп.тормоз. Тупик.
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235864
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TДопустим надо выбрать select Name where Age = 14
тут быстро нашли что Row = 3 а дальше надо искать в Name где Row == 3, т.е. или перебор или надо индекс. Вот я к чему. Если полей много, то по каждому надо искать, т.е. еще доп.тормоз. Тупик.
Нет. Забудь про Row. Нету никаких Row. Нету ROW_ID, нету порядковых номеров строк как Dbf.
Есть память. В ней лежат поля. Такого вида

Код: plaintext
1.
2.
3.
4.
5.
struct field{
    char *value;
    p1 *field; // right neighbour
    p2 *field; // left neighbour
}



И есть Красно черная нода индекса. Которая смотрит в два поля. Либо в NULLS если она листовая.

Код: plaintext
1.
2.
3.
4.
5.
6.
struct blackRedNode{
    int color; // red, black
    field *pField; //
    blackRedNode *leftLeaf;
    blackRedNode *rightLeaf;
}



Вот на этих двух структурах я думаю можно построить такую In-Memory Dbms.

По поводу простых запросов типа

Код: sql
1.
select * from table where name='Вася';



Работать будет 100%.

А вот как сделать сочетание двух условий... я над этим думаю.

Код: sql
1.
select * from table where name='Вася' and age=10;



Пока дошел до того что нужен merge двух R/B деревьев. Или поддеревьев.
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235867
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
И есть Красно черная нода индекса. Которая смотрит в два поля. Либо в NULLS если она листовая.
Тьфу. В одно поле. И в два своих листика (опционально).
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235870
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я дорисовал картинку. (Сорри за рыбий глаз. Фотик сдох. Снимаю регистратором.)

Я дорисовал еще 2 индекса на тестовых данных из таблицы DEPT Из учебного набора Oracle.
И добавил для fields указатели в обратную сторону.
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235896
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton...
Пока дошел до того что нужен merge двух R/B деревьев. Или поддеревьев.

А как ты планируешь мержить свои деревья, если узел одного из них указывает на экземпляр значения 'Вася', а узел другого указывает на экземпляр значения '10'.
Карл, на что должен указывать узел дерева, полученного как результат слияния первых двух?
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235899
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я как-раз думаю над этим. Пока есть два направления:

Выбор самого селективного индекса. А остальные - игнорировать.
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235923
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНет. Забудь про Row. Нету никаких Row. Нету ROW_ID, нету порядковых номеров строк как Dbf.
Есть память. В ней лежат поля. Такого вида
...

По поводу простых запросов типа
Код: sql
1.
select * from table where name='Вася';


Работать будет 100%.
Ничего не понял. Как тут обратно строка соберется?
Чувствую что твоя мысль уже где-то далеко и мне ее не догнать :)

Почитал вики : плюсы в выборке, точнее в ускорении чтения с HDD, т.к. данные столбца хранятся компактнее чем в табличном виде, т.е. читать надо меньше. Но для in-memory это фиолетово, нет такой большой разницы в чтении из кэша проца и из RAM, как с HDD и из RAM, т.е. тут этот плюс исчезает.
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235946
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TНичего не понял. Как тут обратно строка соберется?
Чувствую что твоя мысль уже где-то далеко и мне ее не догнать :)

Смотри мой рисунок. Как только ты нашел field. Ты по горизонтальному указателю по кольцевому
списку соберешь всю строку.

P.S. Моя мысль пока еще недалеко потому что я ее думаю всего 3 дня.
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235950
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T Почитал вики : плюсы в выборке, точнее в ускорении чтения с HDD, т.к. данные столбца хранятся компактнее чем в табличном виде, т.е. читать надо меньше. Но для in-memory это фиолетово, нет такой большой разницы в чтении из кэша проца и из RAM, как с HDD и из RAM, т.е. тут этот плюс исчезает.
Я тоже почитал вики. И пришел к следующему:

1) То что я нарисовал на картинке - это никакая ни column-oriented dbms.
2) Я отказываюсь от названия топика и пересоздам новую тему. Возможно это
будет нечто вроде Cell-Oriented-Dbms, или Index-Oriented e.t.c.

Я еще откомменчу несколько каментов booby если у меня будет что сказать.
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39235956
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПривет человеки.

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

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

Thnx.

Я могу в принципе про это рассказать, но это долго очень.
Вкратце, там супернормализация на уровне храненния данных. Вместо длинных значений хранятся короткие ссылки на заранее составленные словари доменов для колонки.
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39236283
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЗадам другой вопрос. Правильно ли я понял что CODBMS всегда сортируют значения в колонках ?
нет. неправильно
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39236290
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonТогда я разочарован. Я просто искал структуру данных или хранения данных которая
позволяла-бы работать с таблицей так как будто у нее все поля всегда проиндексированы.

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


там прикол другой, там подчас индексы не нужны вообще. за счет супернормализации и сжатия вся таблица влазит в кэш и без индекса работает быстрее, чем row wise с индексом, причем некритичные объемы там в 100-1000 раз больше, и не заметить, что не создал индекс на 10 миллионной таблице, очень легко.
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39236291
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonboobyпропущено...


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

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

лично мое мнение - это ничего не значит пока что.
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39236345
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЯ могу в принципе про это рассказать, но это долго очень.
Вкратце, там супернормализация на уровне храненния данных. Вместо длинных значений хранятся короткие ссылки на заранее составленные словари доменов для колонки.
Я понял. Это мне напомнило опцию COMPRESSED FOR OLTP в Oracle. Начиная толи с 11 толи с 12 версии.
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39236347
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivmaytonТогда я разочарован. Я просто искал структуру данных или хранения данных которая
позволяла-бы работать с таблицей так как будто у нее все поля всегда проиндексированы.

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


там прикол другой, там подчас индексы не нужны вообще. за счет супернормализации и сжатия вся таблица влазит в кэш и без индекса работает быстрее, чем row wise с индексом, причем некритичные объемы там в 100-1000 раз больше, и не заметить, что не создал индекс на 10 миллионной таблице, очень легко.
Ты где-то писал что работал с Vertica? Или мне показалось. Не могу вспомнить.
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39236422
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonMasterZivпропущено...



там прикол другой, там подчас индексы не нужны вообще. за счет супернормализации и сжатия вся таблица влазит в кэш и без индекса работает быстрее, чем row wise с индексом, причем некритичные объемы там в 100-1000 раз больше, и не заметить, что не создал индекс на 10 миллионной таблице, очень легко.
Ты где-то писал что работал с Vertica? Или мне показалось. Не могу вспомнить.

Да, Работаю сейчас прямо.
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39236424
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonMasterZivЯ могу в принципе про это рассказать, но это долго очень.
Вкратце, там супернормализация на уровне храненния данных. Вместо длинных значений хранятся короткие ссылки на заранее составленные словари доменов для колонки.
Я понял. Это мне напомнило опцию COMPRESSED FOR OLTP в Oracle. Начиная толи с 11 толи с 12 версии.

Марк, columnstore исключительно для OLAP/DSS.
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39236440
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton...
2) Я отказываюсь от названия топика и пересоздам новую тему. Возможно это
будет нечто вроде Cell-Oriented-Dbms, или Index-Oriented e.t.c.

Искал себе быстрый локальный движок, нашел три решения:
1. Google Level DB
2. SQL Lite 4
3. Tokyo cabinet
http://fallabs.com/tokyocabinet/

+ всякие самопальные реализации Hash / Btree на диске.

Поскольку мне скорости SQL Lite 3 для практических задач вполне хватает, даже не смотрел
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39236458
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivmaytonпропущено...

Я понял. Это мне напомнило опцию COMPRESSED FOR OLTP в Oracle. Начиная толи с 11 толи с 12 версии.
Марк, columnstore исключительно для OLAP/DSS.
Да я не спорю о классах БД. Просто то что ты рассказал по сжатию справочника домена колонки
похоже на опции Oracle Advanced Compression.

http://www.oracle.com/technetwork/database/focus-areas/storage/advanced-compression-whitepaper-130502.pdf
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39236531
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev+ всякие самопальные реализации Hash / Btree на диске.

Поскольку мне скорости SQL Lite 3 для практических задач вполне хватает, даже не смотрел
Не смотрел на Berkeley-Db?

P.S. Я пошел по неверному пути Паниковского Базиста... Стал думать о своей dbms. Кошмар!
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39236606
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНе смотрел на Berkeley-Db?
Он вроде сейчас коммерческий (((

Хотел Google Level DB посмотреть, но не нашел нормального собранного бинарника под Windows ((( Собирать самому влом.
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39236619
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev, не может быть что коммерческий.
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39236628
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oracle Berkeley DB Licensing Information

Oracle employs a dual licensing model that offers customers a choice of either our open source license or a commercial license. Our open source license is OSI-certified and permits use of Berkeley DB in open source projects or in applications that are not distributed to third parties. Our commercial license permits closed-source distribution of an application to third parties and provides business assurance.

....

Х.з. Я не юрист. Но когда рядом с опен-соурс еще и коммерческую лицензию продают - меня это отпугивает.
...
Рейтинг: 0 / 0
Тяпничная Column-oriented dbms
    #39236740
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

OfftopicДима. Приколись как чувак простые числа считает
http://www.sql.ru/forum/1213226/3iy-den-nichego-ne-vyhodit
...
Рейтинг: 0 / 0
60 сообщений из 60, показаны все 3 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Тяпничная Column-oriented dbms
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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