powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Разработка СУБД, вопросы
50 сообщений из 50, показаны все 2 страниц
Разработка СУБД, вопросы
    #36284428
SoFx00
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем.

Да, да, нужно разработать клиент-серверную реляционную СУБД. Это мой КУРСОВОЙ в универе, ничего больше) К сожалению, читать исходники postgres, berkeley и других нету времени, так что пришлось создать топик (хотя сегодня думаю порыться в исходниках sqlite и leap).
Теорией немного подковался, теперь возникли более-менее конкретные вопросы, направленные на систематизацию и увязку знаний, плюс по деталям реализации.

1) Читал в wiki про ISAM (http://ru.wikipedia.org/wiki/ISAM), смутила фраза
"Второй набор данных — индексы, содержат указатели, которые позволят извлечь определенные записи без поиска по всей базе данных. Это несколько отличается от индексов в современных поисковых базах данных, так как в них индексы хранятся прямо в записях."
Вроде как многие современные СУБД используют b-деревья для индексов и хранят их отдельно от данных. В MSSql отведены отдельные страницы для индексов, если я не ошибаюсь. Да и вообще хранить индексы вместе с данными не очень рационально, как мне кажется. Может есть какие-то новые веяния? Как лучше хранить индексы: с данными или нет?
2) В каком виде лучше всего хранить индексы в оперативной памяти? Так же как и физически - b-дерево (или его часть, если есть ограничение по выделяемой ОЗУ)? Возможно вопрос немного странный, но в описании MуSql говорится про дополнительное использование хэш-таблиц: "Хеш-таблицы в памяти, используемые как временные таблицы."
3) Во время поиска (в т.ч. не по индексам), насколько я понимаю, постоянно придётся подгружать-выгружать данные в-из оперативную память. Чтобы ускорить эти процедуры, данные на внешнем накопителе разбивают на страницы? Стоит ли заморачиваться способом чтения файлов БД: вызовы CreateFile-ReadFile-WriteFile, fopen-fread-fwrite или через проекции в оперативную память File Mappings?
4) Как лучше организовать кэширование данных: по наиболее частым запросам или по наиболее используемым записям (в совокупности от нескольких запросов)? Или дело вкуса?

Буду благодарен за ответы.
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36284453
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по-моему, писать свою СУБД на курсовой - это слишком опрометчивое решение.

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

авторВ каком виде лучше всего хранить индексы в оперативной памяти?
ни в каком. обычно для данных и индексов используется страничная организация. В этом случае в памяти просто организуется кэш, который содержит считываемые с диска и страницы данных и страницы индексов.

авторпостоянно придётся подгружать-выгружать данные в-из оперативную память. Чтобы ускорить эти процедуры, данные на внешнем накопителе разбивают на страницы?
см. выше про кэш.

В общем, предсказываю фиаско. Вам теорию до начала написания кода читать и читать.

авторБуду благодарен за ответы.
все ответы на данные вопросы давно есть в сети и ищутся простым поиском.
В Вашем случае я бы посоветовал прочитать Тиори и Фрай "Проектирование баз данных". Книга хоть и 1985 года, но зато там отлично написано про различные структуры, индексы, страничную организацию и т.п.
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36284470
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SoFx00
(хотя сегодня думаю порыться в исходниках sqlite и leap).

За leap не скажу, но sqlite вроде бы как не клиент-серверная?..
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36284517
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv
по-моему, писать свою СУБД на курсовой - это слишком опрометчивое решение.

А с другой стороны - всего-то взять мега-драйвер из соседнего топика,
обернуть его в сервер и приписать клиента.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36284536
SoFx00
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdvпо-моему, писать свою СУБД на курсовой - это слишком опрометчивое решение.
kdvВ общем, предсказываю фиаско. Вам теорию до начала написания кода читать и читать.
Возможно так кажется со стороны.

kdvТиори и Фрай "Проектирование баз данных"
Спасибо, посмотрю. Пока что прочитанный Дейт мне не слишком много нового дал.

kdv
автор
В каком виде лучше всего хранить индексы в оперативной памяти?

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

Это понятно. Так сделано,например, в MsSql, верно? Страница - это всего лишь промежуточный абстрактный уровень хранения так сказать, А сами индексы по структуре связаны в b-дерево. Может я не совсем понятно выразился, но в данном вопросе я хотел УТОЧНИТЬ саму структуру индекса подгруженного полностью или частично в оперативную память, вернее стоит ли её дополнять и преобразовывать. Для чего же тогда в MySql используются "Хеш-таблицы в памяти, используемые как временные таблицы."?

Dimitry Sibiryakov
За leap не скажу, но sqlite вроде бы как не клиент-серверная?..

Клиент-серверность я сделать смогу)) Меня сейчас интересует именно ядро СУБД. А организовать сокет и сделать обслуживание подключённых клиентов в потоке не очень сложно.
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36284626
Daffy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SoFx00,

Возможно это немного поможет, хоть и на PHP:

Движок СУБД на PHP
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36286322
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SoFx00Пока что прочитанный Дейт мне не слишком много нового дал.

гм. я бы сказал, что Дейт тут вообще ни при чем.

SoFx00Это понятно. Так сделано,например, в MsSql, верно?
так везде сделано.
SoFx00я хотел УТОЧНИТЬ саму структуру индекса подгруженного полностью или частично в оперативную память, вернее стоит ли её дополнять и преобразовывать
для начала будет достаточно обычного страничного b-дерева.

SoFx00Для чего же тогда в MySql используются "Хеш-таблицы в памяти, используемые как временные таблицы."?
без понятия. это фишка конкретного сервера или конкретного движка MySQL. Временные таблицы у всех по разному реализуются.
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36286485
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SoFx00Да, да, нужно разработать клиент-серверную реляционную СУБД. Это мой КУРСОВОЙ в универе, ничего больше) К сожалению, читать исходники postgres, berkeley и других нету времени, так что пришлось создать топик (хотя сегодня думаю порыться в исходниках sqlite и leap).
Теорией немного подковался, теперь возникли более-менее конкретные вопросы, направленные на систематизацию и увязку знаний, плюс по деталям реализации.


Даже если ты "прочитаешь" все исходники postgres, berkeley - это не поможет тебе быстро ответить на твои вопросы. Такой способ ПОЛУЧЕНИЯ ЗНАНИЙ - неприемлим.

Я советую тебе взять любую библиотеку работы с dbf - файлами (с документацией). Перекроить её под себя. Т.е. добавить упрощённый стек SQL команд типа create table... , select... Это удобно для отладки т.к. всегда будет возможность открыть таблицу (dbf) в кустарном редакторе.

SoFx00
1) Читал в wiki про ISAM (http://ru.wikipedia.org/wiki/ISAM), смутила фраза
"Второй набор данных — индексы, содержат указатели, которые позволят извлечь определенные записи без поиска по всей базе данных. Это несколько отличается от индексов в современных поисковых базах данных, так как в них индексы хранятся прямо в записях."
Вроде как многие современные СУБД используют b-деревья для индексов и хранят их отдельно от данных. В MSSql отведены отдельные страницы для индексов, если я не ошибаюсь. Да и вообще хранить индексы вместе с данными не очень рационально, как мне кажется. Может есть какие-то новые веяния? Как лучше хранить индексы: с данными или нет?

Я к сожалению не знаком с технологией ISAM, но могу предположить, что это просто индексно-организованные таблицы. Как это поможет тебе в твоём курсовом - тоже не знаю.

SoFx00
2) В каком виде лучше всего хранить индексы в оперативной памяти? Так же как и физически - b-дерево (или его часть, если есть ограничение по выделяемой ОЗУ)? Возможно вопрос немного странный, но в описании MуSql говорится про дополнительное использование хэш-таблиц: "Хеш-таблицы в памяти, используемые как временные таблицы."

В оперативной памяти конечно проще. Кроме того, есть готовые шаблоны (классы) для B+Tree структур. Хеш-таблицы тоже имет языковые шаблоны в языках программирования.

SoFx00
3) Во время поиска (в т.ч. не по индексам), насколько я понимаю, постоянно придётся подгружать-выгружать данные в-из оперативную память. Чтобы ускорить эти процедуры, данные на внешнем накопителе разбивают на страницы? Стоит ли заморачиваться способом чтения файлов БД: вызовы CreateFile-ReadFile-WriteFile, fopen-fread-fwrite или через проекции в оперативную память File Mappings?

API не имеет значения. Все файловые API примерно одинаковы. На низком уровне это - открыть файл. Прочитать байть (или блок байтов). Закрыть файл. В качестве страницы можешь выбрать строку dbf-файла. Или блок строк. Это удобно т.к. строки dbf имеют физически одинаковый размер.

SoFx00
4) Как лучше организовать кэширование данных: по наиболее частым запросам или по наиболее используемым записям (в совокупности от нескольких запросов)? Или дело вкуса?

Это глубокая оптимизация. На данном этапе это не имеет абсолютно никакого значения т.к. не с чем сравнивать и нет нагрузочного теста. Сделай хотя-бы работающий макет. А там будет видно.
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36286719
opendsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SoFx00kdvпо-моему, писать свою СУБД на курсовой - это слишком опрометчивое решение.
kdvВ общем, предсказываю фиаско. Вам теорию до начала написания кода читать и читать.
Возможно так кажется со стороны.


при наличии времени и желания все возможно.

Ответьте для себя на следующие вопросы.
1. Это однопользовательская база или много пользовательская.
2. Каким временем Вы располагаете.
3. Нужно что бы работало или просто показать и сдать.


SoFx00
В каком виде лучше всего хранить индексы в оперативной памяти?


Уже ответили про страничную организацию.

SoFx00
Это понятно. Так сделано,например, в MsSql, верно? Страница - это всего лишь промежуточный абстрактный уровень хранения так сказать, А сами индексы по структуре связаны в b-дерево. Может я не совсем понятно выразился, но в данном вопросе я хотел УТОЧНИТЬ саму структуру индекса подгруженного полностью или частично в оперативную память,

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



SoFx00
Клиент-серверность я сделать смогу)) Меня сейчас интересует именно ядро СУБД.

Как вы ответили на первый вопрос ?
Много пользовательская ?
Значит погружайтесь в мутексы ( синхронизацию паралельного выполнения)
и распределение ресурсов,
Тут еще одну курсовую хватит.


SoFx00
4) Как лучше организовать кэширование данных: по наиболее частым запросам или по наиболее используемым записям (в совокупности от нескольких запросов)? Или дело вкуса?


Механизм LRU тут еще на одну курсовую насобирать можно.
Учитывая приоритетность вытеснения ( Данные , Индексы, Метаданные и т д.)

з.ы. Если ответ на 3-й вопрос просто показать и сдать, прислушайтесь к совету myton,

mayton
Я советую тебе взять любую библиотеку работы с dbf - файлами (с документацией). Перекроить её под себя. Т.е. добавить упрощённый стек SQL команд типа create table... , select... Это удобно для отладки т.к. всегда будет возможность открыть таблицу (dbf) в кустарном редакторе.


Это я Вам как человек создающий свой мотор СУБД говорю.
При серьезном подходе в 20 000 строках кода Вы не уложитесь даже в прототип.
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36286840
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ к сожалению не знаком с технологией ISAM, но могу предположить, что это просто индексно-организованные таблицы.В реализации MyISAM - обычная куча.
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36286890
Фотография Di_LIne
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SoFx00Это несколько отличается от индексов в современных поисковых базах данных, так как в них индексы хранятся прямо в записях.
- Ох у мне эта педиВикия...
ТС, хотя бы глянул, что лежит в основе открытых поисковых систем.
Того же МногоСерч-а. Он над разными СУБД надстраивается.
По этому - всё зависит от куда и на что смотришь.
В абстрактном представении - "поисковый индекс" жиждется на индексах СУБД.
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36286939
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
opendsaЭто я Вам как человек создающий свой мотор СУБД говорю.
При серьезном подходе в 20 000 строках кода Вы не уложитесь даже в прототип.
Откуда эта цифра?
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36287021
opendsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonopendsaЭто я Вам как человек создающий свой мотор СУБД говорю.
При серьезном подходе в 20 000 строках кода Вы не уложитесь даже в прототип.
Откуда эта цифра?

Цифра указанная выше мое ИМХО.
В свободное время упражняюсь в этом направлении .
http://www.sql.ru/forum/actualthread.aspx?tid=700455

зы Хотя, опять же ИМХО, если смотреть только на прототип , то можно уложиться в 12- 15 тыс строк все зависит от того, что требуется от прототипа.
Меньше вряд ли, при наличии многопользовательского доступа, ACID, LRU буферизации, журнала транзакций.
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36287023
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
opendsaдоступа, ACID, LRU буферизации, журнала транзакций.
Парень! Это всего-лишь курсовой! Автору надо просто продемонстрировать РСУБД. И ничего более. Выполнить программу-минимум. Я понимаю твоё рвение, но это, поверь не тот случай.
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36287026
opendsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonopendsaдоступа, ACID, LRU буферизации, журнала транзакций.
Парень! Это всего-лишь курсовой! Автору надо просто продемонстрировать РСУБД. И ничего более. Выполнить программу-минимум. Я понимаю твоё рвение, но это, поверь не тот случай.

Человек спрашивает - я отвечаю.

Из тех вопросов которые он задает 3 качественных курсовых можно сделать.

И на диплом и даже на дисерт хватит при должном подходе.
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36287191
SoFx00
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Первое, что надо сказать, это огромное спасибо, народ, что не поленились ответить. СПАСИБО всем, кто принял участие в обсуждение.

kdv
гм. я бы сказал, что Дейт тут вообще ни при чем.

Я сказал то же самое) Научный руководитель посоветовал читать Дейта "Введение в системы баз данных", но пользы это принесло мало.

kdv
без понятия. это фишка конкретного сервера или конкретного движка MySQL. Временные таблицы у всех по разному реализуются.

Я уже разобрался для чего) В таблицах InnoDB при БД небольшого размера, которая полностью или почти полностью вмещается в оперативную память, MySQL на основе B-дерева строит хэш-таблицу, считая, что в данном случае это ускорит доступ.

mayton
Даже если ты "прочитаешь" все исходники postgres, berkeley - это не поможет тебе быстро ответить на твои вопросы. Такой способ ПОЛУЧЕНИЯ ЗНАНИЙ - неприемлим.

Да, для быстрого получения знаний это не подходит. Сейчас читаю статьи по СУБД, большинство из них правда на английском, но мне это не сильно мешает)

mayton
API не имеет значения. Все файловые API примерно одинаковы. На низком уровне это - открыть файл. Прочитать байть (или блок байтов). Закрыть файл. В качестве страницы можешь выбрать строку dbf-файла. Или блок строк. Это удобно т.к. строки dbf имеют физически одинаковый размер.

Имеет. File Mappings работают через механизм страничной организации виртуальной памяти. fread и компания осуществляют дополнительную буферизацию данных и могут без "доточки" использоваться для чтения небольших порций. ReadFile и КО - то, что в конце концов вызовет fread - лучше использовать для чтения больших объёмов и разбираться с буферизацией самому, но зато сам знаешь где и как буферизиризация происходит.

mayton
Это глубокая оптимизация. На данном этапе это не имеет абсолютно никакого значения т.к. не с чем сравнивать и нет нагрузочного теста. Сделай хотя-бы работающий макет. А там будет видно.

Да, я от кэширования отказался. Просто не успею. Лучше потом добавить, если время будет.

opendsa
1. Это однопользовательская база или много пользовательская.
2. Каким временем Вы располагаете.
3. Нужно что бы работало или просто показать и сдать.

Многопользовательская, подробнее ниже.
Времени маловато.
Чтобы работало и сдать. Не сверхсложное, но и чтобы стыдно не было.

opendsa
На этом уровне все абстракция.
Вам нужно создать прозрачный механизм быстрого поиска ( прямой и коственной адресации данных через индексы).
Диск <-> Память (индекс) + Диск <-> Память (Данные)
Обычно для этого используется абстракция под названием ROWID.
Только формулы , алгоритмы сортировок и блок схемы уже потянут на курсовую.

ROWID - это, насколько я понимаю, физический адрес записи (файл->блок->страница->номер_записи), который заодно используется как уникальный идентификатор???

opendsa
Как вы ответили на первый вопрос ?
Много пользовательская ?
Значит погружайтесь в мутексы ( синхронизацию паралельного выполнения)
и распределение ресурсов,
Тут еще одну курсовую хватит.

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

opendsa
Механизм LRU тут еще на одну курсовую насобирать можно.
Учитывая приоритетность вытеснения ( Данные , Индексы, Метаданные и т д.)

Как я уже написал, кэширование исключил из планов.

opendsa
все зависит от того, что требуется от прототипа.

Как раз сижу над спецификацией, чтобы можно было начать разрабатывать архитектуру.

mayton
Парень! Это всего-лишь курсовой! Автору надо просто продемонстрировать РСУБД. И ничего более. Выполнить программу-минимум. Я понимаю твоё рвение, но это, поверь не тот случай.


opendsa
Человек спрашивает - я отвечаю.

Из тех вопросов которые он задает 3 качественных курсовых можно сделать.

И на диплом и даже на дисерт хватит при должном подходе.

Да всё нормально, мне как минимум нужно было узнать "потолок" этой работы и оценить время.

Возможно завтра покажу спецификацию требований.

Ещё раз: всем спасибо.
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36287206
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SoFx00
Имеет. File Mappings работают через механизм страничной организации виртуальной памяти. fread и компания осуществляют дополнительную буферизацию данных и могут без "доточки" использоваться для чтения небольших порций. ReadFile и КО - то, что в конце концов вызовет fread - лучше использовать для чтения больших объёмов и разбираться с буферизацией самому, но зато сам знаешь где и как буферизиризация происходит.
Ну что-же, используй FileMapping. Только почитай на всякий случай различные рекомендации по приминению, и преимущества и недостатки данной технологии.
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36287522
Фотография Диез
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SoFx00,

SoFx00
Клиент-серверность я сделать смогу)) Меня сейчас интересует именно ядро СУБД. А организовать сокет и сделать обслуживание подключённых клиентов в потоке не очень сложно.

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


Этого недостаточно. Если вы планируете действительно многопользовательскую СУБД, вам придется озадачиться вопросами транзакционности и изоляции транзакций. Плюс аутентификация/авторизация, но это проще.

Иначе вы сделаете не многопользовательскую, а "однопользовательскую бд с сетевым доступом" :)
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36287659
opnendsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SoFx00

ROWID - это, насколько я понимаю, физический адрес записи (файл->блок->страница->номер_записи), который заодно используется как уникальный идентификатор???



В общих чертах да, в случае если у вас на один обьект БД будет один файл,
Если в одном файле может содержаться несколько обьектов(таблиц , индексов)
То нужно вводить еще одну абстракцию под названием экстент.
В терминах СУБД это неразрывный кусок дискового пространства принадлижащий обьекту БД.
Так как экстенты разных объектов могут чередоваться по мере роста обьектов,
то ROWID считать не относительно файла , а относительно экстентов объекта.
Создавать виртуальное непрерывное пространство объекта.
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36287702
opendsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дополнение к предыдущему посту.
Отдельной темой изысканий становятся разряженные таблицы,
когда таблица сначала растет, а потом оттуда удаляются записи.
И при следующей вставке нужно использовать это пространство,
что бы таблица дальше не росла, ведь свободное место есть,
и его нужно использовать(быстро находить),
Либо писать сервисную утилиту паковщик таблицы с перестройкой индексов.
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36289623
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу ROWID. Теоретически, стек файл->блок->страница->номер_записи может быть упрощён. Всё зависит от того, насколько глубоко реализована структура данных файла БД. Для БД, работающих только в памяти (In-Memory databases) аналогом ROWID может быть обычный указатель. Это даже даёт прирост в производительности в критичных приложениях.
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36404105
SoFx00
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Наверное, будет правильным, если я отпишусь о результатах)
СУБД написана, курсач сдан.

Был создан прототип колоночной СУБД. В общем-то с самого начала я на такую схему и рассчитывал - сделать что-то новое в строковых хранилищах очень тяжело. А колоночные на данный момент - непочатый край работы, куча вариантов и идей)) Ну надеюсь, мысль понятна. Хотя скажу сразу: при разработке мне показалось, что строковую было бы написать гораздо легче.

Что конретно было реализовано (Язык - C со вставками C++ :) ):
- Менеджер страниц (диск <-> память) с поддержкой многопоточности
- Полные индексы на основе B+ деревьев (без кластерных, добавление новой записи идёт точно в конец таблицы)
- Многопоточная обработка запросов: вставка и выборка (без удаления). Выборка только с критерием AND (немного упростил задачу :))
- 5 базовых типов данных: INT32, UINT32, DOUBLE, STRING (аналог char в mysql), TEXT - просто текст нефиксированной длины, максимально 32 килобайта. В общем потом добавил byte и short int. Это непринципиально как вы понимаете.
- Многопользовательский доступ по сети.

Результаты:
Тестовая таблица - INT (индекс/primary index в MySQL), INT, STRING, TEXT, DOUBLE, INT.
Время вставки 5000 записей - в 2 раза больше, чем в MySQL (0.16 и 0.08).
Время выборки 2000 записей из 5000, находящихся в таблице более чем в 10 раз меньше (0.0012 и 0.03).
Естесственно, это результаты только прототипа, а не полноценной СУБД, но при конечной реализации я думаю результаты не изменятся слишком сильно. Код СУБД - не оптимизировался специально, результаты только за счёт колоночной модели.
Тесты при многопользовательском доступе не проводились.

Замечания:
Самые сложные места в разработке - это проектирование архитектуры и синхронизация потоков (для синхронизации доступа к B+ дереву пришлось придумывать спин-блокировку с 3-мя состояниями :)).

Резюме:
Преимущества и недостатки колоночных СУБД подтверждены на практике.
Если кому-то придёт в голову взять на курсовой и диплом СУБД, вот мой совет - ну его нафиг)

Если кому-то интересно - поделюсь исходником. Но в паблик выкладывать не буду... Из-за катастрофической нехватки времени код более-менее нормальный только в модуле менеджера страниц.
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36404120
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гигант...
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36404289
smansdb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SoFx00 Самые сложные места в разработке - это проектирование архитектуры и синхронизация потоков (для синхронизации доступа к B+ дереву пришлось придумывать спин-блокировку с 3-мя состояниями :)) На Java синхронизация многопоточности выполняется элементарно…
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36404416
SoFx00
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdvгигант...

спасибо, коль не шутите.

smansdbSoFx00 Самые сложные места в разработке - это проектирование архитектуры и синхронизация потоков (для синхронизации доступа к B+ дереву пришлось придумывать спин-блокировку с 3-мя состояниями :)) На Java синхронизация многопоточности выполняется элементарно…

Java - это не язык для написания быстрой СУБД. Я плохо знаком с явой, но вряд ли средства синхронизации в ней сильно отличаются от имеющихся на Win32 и алгоритмических: те же критические секции и проч. Тройной спинлок нужен для быстрой многопоточной работы с b+ индексами. Поясню: один поток начинает читать индекс, второй тоже хочет читать. Если тупо блокировать работу с индексом - огромное падение производительности, т.к. второй поток вынужден ждать окончания чтения, вместо выполнения параллельно. Поэтому надо вводить 3 состояния - чтение, запись, не_используется и на их основе строить логику новой спинблокировки.
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36404421
DPH3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм, на Java очень богатая библиотека примитивов синхронизации, в том числе атомарные операции, неблокирующие очереди и прочие радости современной науки :)
Стоит их внимательно изучить перед реализацией, там много уже готового.

Теоретически, для курсовой работы, Java - вполне себе язык для разработки БД. Тем более что БД на Java вполне себе есть, даже opensource :)

Проблемы будут со сборкой мусора под нагрузкой, но и они решаемые.
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36404425
SoFx00
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DPH3Хм, на Java очень богатая библиотека примитивов синхронизации, в том числе атомарные операции, неблокирующие очереди и прочие радости современной науки :)
Стоит их внимательно изучить перед реализацией, там много уже готового.

Теоретически, для курсовой работы, Java - вполне себе язык для разработки БД. Тем более что БД на Java вполне себе есть, даже opensource :)

Проблемы будут со сборкой мусора под нагрузкой, но и они решаемые.

Поверю на слово, скорее всего так и есть: там бы это всё выглядело более строго) Но всё-таки java - не технология для написания БЫСТРОЙ Субд. Компилируемые C/C++ в любом случае быстрее. А мне ведь ещё надо было адекватно сравнить с MySql и прочими)

ЗЫ А атомарные операции поддерживаются на уровне процессора.
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36404429
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SoFx00
один поток начинает читать индекс, второй тоже хочет читать. Если тупо
блокировать работу с индексом - огромное падение производительности,
т.к. второй поток вынужден ждать окончания чтения, вместо выполнения
параллельно. Поэтому надо вводить 3 состояния - чтение, запись,
не_используется и на их основе строить логику новой спинблокировки.

Э-э-э... Т.е. ты не читал Рихтера? Там целая глава посвящена именно
разводу читателей и писателей. Двумя мутексами.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36404438
SoFx00
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторЭ-э-э... Т.е. ты не читал Рихтера? Там целая глава посвящена именно
разводу читателей и писателей. Двумя мутексами.

Читал. Но такого если честно не помню. В любом случае задача решена лично мною, без подсказок, причём решение в итоге вышло достаточно изящное... Хотя обидно будет, если убил время на изобретение велосипеда)
Ну и к слову, мьютексы использовать для синхронизации внутри одного процесса - плохо. Переключение в режим ядра занимает много процессорного времени)
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36404571
Nebo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторИз тех вопросов которые он задает 3 качественных курсовых можно сделать.

И на диплом и даже на дисерт хватит при должном подходе.


ТОЧНО:)
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36404772
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
smansdb пишет:

> На Java синхронизация многопоточности выполняется элементарно…

Это гон. Она везде одинаково сложна. Не сама синхронизация (она
везде проста), а проектирование приложения таким образом, чтобы
правильно делать синхронизацию.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36404790
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SoFx00 пишет:

> Java - это не язык для написания быстрой СУБД. Я плохо знаком с явой, но
> вряд ли средства синхронизации в ней сильно отличаются от имеющихся на
> Win32 и алгоритмических: те же критические секции и проч. Тройной

Не сильно отличается. Там есть только высокоуровневые встроенные в язык
примитивы синхронизации типа автоматически синхронизированных блоков кода и
автоматически синхронизированных методов класса.

> спинлок нужен для быстрой многопоточной работы с b+ индексами. Поясню:
> один поток начинает читать индекс, второй тоже хочет читать. Если тупо
> блокировать работу с индексом - огромное падение производительности,
> т.к. второй поток вынужден ждать окончания чтения, вместо выполнения
> параллельно. Поэтому надо вводить 3 состояния - чтение, запись,
> не_используется и на их основе строить логику новой спинблокировки.

На самом деле есть специальные алгоритмы прохода по дереву, которые
позволяют не блокировать дерево целиком. А конкретные страницы
индекса блокируются обычными блокировками страниц данных в рамках
транзакций.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36404811
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SoFx00разработать клиент-серверную реляционную СУБД. Это мой КУРСОВОЙ в универе, ничего больше
Я фигею, господа. Оказывается есть некий универ, где такая задача это всего лишь курсовой. Если это так, то в стране должны производиться десятки клиент-серверных реляционных СУБД.
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36404844
синхронизатор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Э-э-э... Т.е. ты не читал Рихтера? Там целая глава посвящена именно
разводу читателей и писателей. Двумя мутексами.


Точно Двумя ?

з.ы. Рихтера не читал, но ИМХО это невозможно двумя.
Потому мне неизвестна операция( системный вызов) способный атомарно ( за одни вызов)
проверить + взвести 2 мутекса одновременно. Все это нужно защищать 3-им мутексом на входе.
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36405048
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Синхронизатор
мне неизвестна операция( системный вызов) способный атомарно ( за одни
вызов) проверить + взвести 2 мутекса одновременно.

WaitForMultipleObjects()?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36405077
синхронизатор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Синхронизатор
мне неизвестна операция( системный вызов) способный атомарно ( за одни
вызов) проверить + взвести 2 мутекса одновременно.

Wait ForMultipleObjects()?


Не то.
MSDN
Waits until one or all of the specified objects are in the signaled state or the time-out interval elapses.


Нужно не проверить, а атомарно взвести так,
что бы никто другой не вскочил между 2 -мя операциями с разными мутексами,
а лучше вообще за один системный вызов.
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36405119
SoFx00
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv
smansdb пишет:

> На Java синхронизация многопоточности выполняется элементарно…

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


+1

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


Искал такие алгоритмы, не нашёл. Ну и времени не было. Насчёт блокировки конкретных страниц - это конечно да, но что делать, если страница дерева расщепляется (ну или сливаются две), а другие потоки где-то рядом? Поэтому делал на уровне работы со всем деревом - чтение (может быть много потоков), запись (только 1 поток), unused.

авторЯ фигею, господа. Оказывается есть некий универ, где такая задача это всего лишь курсовой. Если это так, то в стране должны производиться десятки клиент-серверных реляционных СУБД.

Вы считаете, что я лгу? Тема - результат моей самоуверенности, универ - в Минске, БГУИР называется.

автор
проверить + взвести 2 мутекса одновременно. Все это нужно защищать 3-им мутексом на входе.


У меня вообще используется один синхронизирующий примитив - одна спинлок-переменная) Приоритет при синхронизации больше у читателей и это лучше для колоночной СУБД, т.к. они select-ориентированные.
Ладно, пойду искать в Рихтере вышеназванный пример.
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36405129
синхронизатор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
синхронизатор

а лучше вообще за один системный вызов.


вроде нашел

http://msdn.microsoft.com/en-us/library/ms686360%28VS.85%29.aspx
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36405155
синхронизатор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
синхронизаторсинхронизатор

а лучше вообще за один системный вызов.


вроде нашел

http://msdn.microsoft.com/en-us/library/ms686360%28VS.85%29.aspx

Minimum supported client - Windows Vista
Minimum supported server - Windows Server 2008
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36405167
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
синхронизаторНужно не проверить, а атомарно взвести

Что такое "взвести" для мутекса? Не "подождать" ли пока он не
освободится? Если ты скормишь ей два мутекса, то она не вернётся пока
оба они не будут "взведены".
И это системный вызов. Один.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36405548
синхронизатор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
синхронизаторНужно не проверить, а атомарно взвести

Что такое "взвести" для мутекса? Не "подождать" ли пока он не
освободится? Если ты скормишь ей два мутекса, то она не вернётся пока
оба они не будут "взведены".
И это системный вызов. Один.


Все равно, что то не сходится.

Как проверить оба , а взвести только один ?
За один вызов естественно .

з.ы. прошу прощения за возможно глупый вопрос.
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36406393
smans
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv
smansdb пишет:

> На Java синхронизация многопоточности выполняется элементарно…

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

Самый простой вариант "проектирования приложения" для клиент-серверной архитектуры:
1. Взять легкую однопользовательскую СУБД.
2. Разработать анализатор входных запросов для разделения их на два типа SELECT и EDIT (UPDATE, CREATE, INSERT ...).
3. Разработать синхронизирующий модуль. Вы хоть знаете Java? Собственно синхронизирующий объект используется только для операции EDIT. Если эта операция выполняется все остальные потоки ждут в очереди. Один поток соответствует одному пользователю.

Что непонятно? Не забывайте это курсовик и не требуется супер-пупер оптимизация.
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36406819
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SoFx00 wrote:

> Искал такие алгоритмы, не нашёл. Ну и времени не было. Насчёт блокировки

Кажется есть у Гарсия-молино, Ульман, Уидом.
И в Transaction processing by Grey & Bernstain.
Хотя точно не помню.

> конкретных страниц - это конечно да, но что делать, если страница дерева
> расщепляется (ну или сливаются две), а другие потоки где-то рядом?

Блокируются все изменяемые страницы.

> Поэтому делал на уровне работы со всем деревом - чтение (может быть
> много потоков), запись (только 1 поток), unused.

В реяльной СУБД тебя бы за такое ...


Ну да ладно, для учебного примера и это -- очень и очень здорово.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36406982
синхронизатор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv

> конкретных страниц - это конечно да, но что делать, если страница дерева
> расщепляется (ну или сливаются две), а другие потоки где-то рядом?

Блокируются все изменяемые страницы.


Если меняется размер дерева, то дерево или бренч нужно блокировать целяком,
тоже разделяя читателей и писателей.

Если при проектировке что то не было учтено,
веселая отладка получается, с одной стороны непредсказуемое поведение ,
с другой дедлоки.
В конечном итоге, как правило, синхронизация переписывается с доучтением.

MasterZiv
> Поэтому делал на уровне работы со всем деревом - чтение (может быть
> много потоков), запись (только 1 поток), unused.

В реяльной СУБД тебя бы за такое ...


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

MasterZiv
Ну да ладно, для учебного примера и это -- очень и очень здорово.


+1
Автору респект.
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36407232
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
синхронизатор wrote:

> Если меняется размер дерева, то дерево или бренч нужно блокировать целяком,
> тоже разделяя читателей и писателей.

Что такое "размер дерева" -- не понятно точно так же, как и то, зачем
блокировать всё дерево целиком.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36407417
синхронизатор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
синхронизатор wrote:

> Если меняется размер дерева, то дерево или бренч нужно блокировать целяком,
> тоже разделяя читателей и писателей.

Что такое "размер дерева" -- не понятно точно так же, как и то, зачем
блокировать всё дерево целиком.



Имеется ввиду ращепление или объединение ветвей, удаление ветвей.
Приблизительно сценарий выглядит так :
В бренче который ращепляется , объеденяется, удаляется уже есть
заблокированные страницы на чтение.
Теоретически существует вероятность того , что сессия которая
читает листовы блоки ращепляемого ( объединяемого, удаляемого ) бренча
и прочитает то, что не совсем соответствует реалиям жизни .
То есть прежде чем блокировать страницу, нужно просмотреть не заблокирован
ли ее бренч . И наоборот, прежде чем блокировать бренч,
нужно проверить все ходящие в него подбренчи и листья на предмет блокировок.

Как делать эту проверку, или ждать на блокировке как у ТС, или ставить блокировки на
все подчиненные бренчи листья определяется архитектурой взаимодействия нитей.
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36411697
Фотография Хрен
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SoFx00
Тройной спинлок нужен для быстрой многопоточной работы с b+ индексами. Поясню: один поток начинает читать индекс, второй тоже хочет читать. Если тупо блокировать работу с индексом - огромное падение производительности, т.к. второй поток вынужден ждать окончания чтения, вместо выполнения параллельно. Поэтому надо вводить 3 состояния - чтение, запись, не_используется и на их основе строить логику новой спинблокировки.

В java для этого используется rwlock http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/locks/ReadWriteLock.html
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36412984
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну яЯ фигею, господа. Оказывается есть некий универ, где такая задача это всего лишь курсовой.
Вообще-то в моём родном универе такую курсовую дают уже второй десяток лет...
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36915281
Фотография mriadus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
SoFx00 wrote:

> Искал такие алгоритмы, не нашёл. Ну и времени не было. Насчёт блокировки

Кажется есть у Гарсия-молино, Ульман, Уидом.
И в Transaction processing by Grey & Bernstain.
Хотя точно не помню.

> конкретных страниц - это конечно да, но что делать, если страница дерева
> расщепляется (ну или сливаются две), а другие потоки где-то рядом?

Блокируются все изменяемые страницы.

> Поэтому делал на уровне работы со всем деревом - чтение (может быть
> много потоков), запись (только 1 поток), unused.

В реяльной СУБД тебя бы за такое ...


Ну да ладно, для учебного примера и это -- очень и очень здорово.
Posted via ActualForum NNTP Server 1.4
А расскажи про реальный мир?
...
Рейтинг: 0 / 0
Разработка СУБД, вопросы
    #36915284
Фотография mriadus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дело не в универе, а в человеке.
...
Рейтинг: 0 / 0
50 сообщений из 50, показаны все 2 страниц
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Разработка СУБД, вопросы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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