powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Тяпничная Column-oriented dbms
25 сообщений из 60, страница 2 из 3
Тяпничная 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
25 сообщений из 60, страница 2 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Тяпничная Column-oriented dbms
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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