|
|
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
Привет всем. Да, да, нужно разработать клиент-серверную реляционную СУБД. Это мой КУРСОВОЙ в универе, ничего больше) К сожалению, читать исходники 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) Как лучше организовать кэширование данных: по наиболее частым запросам или по наиболее используемым записям (в совокупности от нескольких запросов)? Или дело вкуса? Буду благодарен за ответы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2009, 14:54 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
по-моему, писать свою СУБД на курсовой - это слишком опрометчивое решение. авторсовременных поисковых базах данных, так как в них индексы хранятся прямо в записях. смотреть не стал, я так понимаю, это про "поисковые базы данных", а не обычные. Разумеется, в обычных данные и индексы хранятся отдельно, за исключением "кластерных индексов", где таблица просто отсортирована по столбцам ключа. Например, так было сделано еще в Paradox. авторВ каком виде лучше всего хранить индексы в оперативной памяти? ни в каком. обычно для данных и индексов используется страничная организация. В этом случае в памяти просто организуется кэш, который содержит считываемые с диска и страницы данных и страницы индексов. авторпостоянно придётся подгружать-выгружать данные в-из оперативную память. Чтобы ускорить эти процедуры, данные на внешнем накопителе разбивают на страницы? см. выше про кэш. В общем, предсказываю фиаско. Вам теорию до начала написания кода читать и читать. авторБуду благодарен за ответы. все ответы на данные вопросы давно есть в сети и ищутся простым поиском. В Вашем случае я бы посоветовал прочитать Тиори и Фрай "Проектирование баз данных". Книга хоть и 1985 года, но зато там отлично написано про различные структуры, индексы, страничную организацию и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2009, 15:31 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
SoFx00 (хотя сегодня думаю порыться в исходниках sqlite и leap). За leap не скажу, но sqlite вроде бы как не клиент-серверная?.. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2009, 15:52 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
kdv по-моему, писать свою СУБД на курсовой - это слишком опрометчивое решение. А с другой стороны - всего-то взять мега-драйвер из соседнего топика, обернуть его в сервер и приписать клиента. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2009, 16:28 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
kdvпо-моему, писать свою СУБД на курсовой - это слишком опрометчивое решение. kdvВ общем, предсказываю фиаско. Вам теорию до начала написания кода читать и читать. Возможно так кажется со стороны. kdvТиори и Фрай "Проектирование баз данных" Спасибо, посмотрю. Пока что прочитанный Дейт мне не слишком много нового дал. kdv автор В каком виде лучше всего хранить индексы в оперативной памяти? ни в каком. обычно для данных и индексов используется страничная организация. В этом случае в памяти просто организуется кэш, который содержит считываемые с диска и страницы данных и страницы индексов. Это понятно. Так сделано,например, в MsSql, верно? Страница - это всего лишь промежуточный абстрактный уровень хранения так сказать, А сами индексы по структуре связаны в b-дерево. Может я не совсем понятно выразился, но в данном вопросе я хотел УТОЧНИТЬ саму структуру индекса подгруженного полностью или частично в оперативную память, вернее стоит ли её дополнять и преобразовывать. Для чего же тогда в MySql используются "Хеш-таблицы в памяти, используемые как временные таблицы."? Dimitry Sibiryakov За leap не скажу, но sqlite вроде бы как не клиент-серверная?.. Клиент-серверность я сделать смогу)) Меня сейчас интересует именно ядро СУБД. А организовать сокет и сделать обслуживание подключённых клиентов в потоке не очень сложно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2009, 16:50 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
SoFx00Пока что прочитанный Дейт мне не слишком много нового дал. гм. я бы сказал, что Дейт тут вообще ни при чем. SoFx00Это понятно. Так сделано,например, в MsSql, верно? так везде сделано. SoFx00я хотел УТОЧНИТЬ саму структуру индекса подгруженного полностью или частично в оперативную память, вернее стоит ли её дополнять и преобразовывать для начала будет достаточно обычного страничного b-дерева. SoFx00Для чего же тогда в MySql используются "Хеш-таблицы в памяти, используемые как временные таблицы."? без понятия. это фишка конкретного сервера или конкретного движка MySQL. Временные таблицы у всех по разному реализуются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2009, 16:08 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
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) Как лучше организовать кэширование данных: по наиболее частым запросам или по наиболее используемым записям (в совокупности от нескольких запросов)? Или дело вкуса? Это глубокая оптимизация. На данном этапе это не имеет абсолютно никакого значения т.к. не с чем сравнивать и нет нагрузочного теста. Сделай хотя-бы работающий макет. А там будет видно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2009, 16:53 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
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 строках кода Вы не уложитесь даже в прототип. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2009, 17:54 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
maytonЯ к сожалению не знаком с технологией ISAM, но могу предположить, что это просто индексно-организованные таблицы.В реализации MyISAM - обычная куча. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2009, 18:35 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
SoFx00Это несколько отличается от индексов в современных поисковых базах данных, так как в них индексы хранятся прямо в записях. - Ох у мне эта педиВикия... ТС, хотя бы глянул, что лежит в основе открытых поисковых систем. Того же МногоСерч-а. Он над разными СУБД надстраивается. По этому - всё зависит от куда и на что смотришь. В абстрактном представении - "поисковый индекс" жиждется на индексах СУБД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2009, 19:09 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
opendsaЭто я Вам как человек создающий свой мотор СУБД говорю. При серьезном подходе в 20 000 строках кода Вы не уложитесь даже в прототип. Откуда эта цифра? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2009, 19:50 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
maytonopendsaЭто я Вам как человек создающий свой мотор СУБД говорю. При серьезном подходе в 20 000 строках кода Вы не уложитесь даже в прототип. Откуда эта цифра? Цифра указанная выше мое ИМХО. В свободное время упражняюсь в этом направлении . http://www.sql.ru/forum/actualthread.aspx?tid=700455 зы Хотя, опять же ИМХО, если смотреть только на прототип , то можно уложиться в 12- 15 тыс строк все зависит от того, что требуется от прототипа. Меньше вряд ли, при наличии многопользовательского доступа, ACID, LRU буферизации, журнала транзакций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2009, 21:01 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
opendsaдоступа, ACID, LRU буферизации, журнала транзакций. Парень! Это всего-лишь курсовой! Автору надо просто продемонстрировать РСУБД. И ничего более. Выполнить программу-минимум. Я понимаю твоё рвение, но это, поверь не тот случай. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2009, 21:05 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
maytonopendsaдоступа, ACID, LRU буферизации, журнала транзакций. Парень! Это всего-лишь курсовой! Автору надо просто продемонстрировать РСУБД. И ничего более. Выполнить программу-минимум. Я понимаю твоё рвение, но это, поверь не тот случай. Человек спрашивает - я отвечаю. Из тех вопросов которые он задает 3 качественных курсовых можно сделать. И на диплом и даже на дисерт хватит при должном подходе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2009, 21:09 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
Первое, что надо сказать, это огромное спасибо, народ, что не поленились ответить. СПАСИБО всем, кто принял участие в обсуждение. 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 качественных курсовых можно сделать. И на диплом и даже на дисерт хватит при должном подходе. Да всё нормально, мне как минимум нужно было узнать "потолок" этой работы и оценить время. Возможно завтра покажу спецификацию требований. Ещё раз: всем спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2009, 00:13 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
SoFx00 Имеет. File Mappings работают через механизм страничной организации виртуальной памяти. fread и компания осуществляют дополнительную буферизацию данных и могут без "доточки" использоваться для чтения небольших порций. ReadFile и КО - то, что в конце концов вызовет fread - лучше использовать для чтения больших объёмов и разбираться с буферизацией самому, но зато сам знаешь где и как буферизиризация происходит. Ну что-же, используй FileMapping. Только почитай на всякий случай различные рекомендации по приминению, и преимущества и недостатки данной технологии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2009, 00:39 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
SoFx00, SoFx00 Клиент-серверность я сделать смогу)) Меня сейчас интересует именно ядро СУБД. А организовать сокет и сделать обслуживание подключённых клиентов в потоке не очень сложно. SoFx00 Распараллеливание и синхронизацию я смогу сделать сам, использовать сложные алгоритмы распределения ресурсов и балнсировки нагрузки не планирую. Этого недостаточно. Если вы планируете действительно многопользовательскую СУБД, вам придется озадачиться вопросами транзакционности и изоляции транзакций. Плюс аутентификация/авторизация, но это проще. Иначе вы сделаете не многопользовательскую, а "однопользовательскую бд с сетевым доступом" :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2009, 10:10 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
SoFx00 ROWID - это, насколько я понимаю, физический адрес записи (файл->блок->страница->номер_записи), который заодно используется как уникальный идентификатор??? В общих чертах да, в случае если у вас на один обьект БД будет один файл, Если в одном файле может содержаться несколько обьектов(таблиц , индексов) То нужно вводить еще одну абстракцию под названием экстент. В терминах СУБД это неразрывный кусок дискового пространства принадлижащий обьекту БД. Так как экстенты разных объектов могут чередоваться по мере роста обьектов, то ROWID считать не относительно файла , а относительно экстентов объекта. Создавать виртуальное непрерывное пространство объекта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2009, 10:59 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
Дополнение к предыдущему посту. Отдельной темой изысканий становятся разряженные таблицы, когда таблица сначала растет, а потом оттуда удаляются записи. И при следующей вставке нужно использовать это пространство, что бы таблица дальше не росла, ведь свободное место есть, и его нужно использовать(быстро находить), Либо писать сервисную утилиту паковщик таблицы с перестройкой индексов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2009, 11:17 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
По поводу ROWID. Теоретически, стек файл->блок->страница->номер_записи может быть упрощён. Всё зависит от того, насколько глубоко реализована структура данных файла БД. Для БД, работающих только в памяти (In-Memory databases) аналогом ROWID может быть обычный указатель. Это даже даёт прирост в производительности в критичных приложениях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2009, 23:12 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
Наверное, будет правильным, если я отпишусь о результатах) СУБД написана, курсач сдан. Был создан прототип колоночной СУБД. В общем-то с самого начала я на такую схему и рассчитывал - сделать что-то новое в строковых хранилищах очень тяжело. А колоночные на данный момент - непочатый край работы, куча вариантов и идей)) Ну надеюсь, мысль понятна. Хотя скажу сразу: при разработке мне показалось, что строковую было бы написать гораздо легче. Что конретно было реализовано (Язык - 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-мя состояниями :)). Резюме: Преимущества и недостатки колоночных СУБД подтверждены на практике. Если кому-то придёт в голову взять на курсовой и диплом СУБД, вот мой совет - ну его нафиг) Если кому-то интересно - поделюсь исходником. Но в паблик выкладывать не буду... Из-за катастрофической нехватки времени код более-менее нормальный только в модуле менеджера страниц. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2010, 19:06 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
гигант... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2010, 19:13 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
SoFx00 Самые сложные места в разработке - это проектирование архитектуры и синхронизация потоков (для синхронизации доступа к B+ дереву пришлось придумывать спин-блокировку с 3-мя состояниями :)) На Java синхронизация многопоточности выполняется элементарно… ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2010, 21:39 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
kdvгигант... спасибо, коль не шутите. smansdbSoFx00 Самые сложные места в разработке - это проектирование архитектуры и синхронизация потоков (для синхронизации доступа к B+ дереву пришлось придумывать спин-блокировку с 3-мя состояниями :)) На Java синхронизация многопоточности выполняется элементарно… Java - это не язык для написания быстрой СУБД. Я плохо знаком с явой, но вряд ли средства синхронизации в ней сильно отличаются от имеющихся на Win32 и алгоритмических: те же критические секции и проч. Тройной спинлок нужен для быстрой многопоточной работы с b+ индексами. Поясню: один поток начинает читать индекс, второй тоже хочет читать. Если тупо блокировать работу с индексом - огромное падение производительности, т.к. второй поток вынужден ждать окончания чтения, вместо выполнения параллельно. Поэтому надо вводить 3 состояния - чтение, запись, не_используется и на их основе строить логику новой спинблокировки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2010, 00:15 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
Хм, на Java очень богатая библиотека примитивов синхронизации, в том числе атомарные операции, неблокирующие очереди и прочие радости современной науки :) Стоит их внимательно изучить перед реализацией, там много уже готового. Теоретически, для курсовой работы, Java - вполне себе язык для разработки БД. Тем более что БД на Java вполне себе есть, даже opensource :) Проблемы будут со сборкой мусора под нагрузкой, но и они решаемые. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2010, 00:23 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
DPH3Хм, на Java очень богатая библиотека примитивов синхронизации, в том числе атомарные операции, неблокирующие очереди и прочие радости современной науки :) Стоит их внимательно изучить перед реализацией, там много уже готового. Теоретически, для курсовой работы, Java - вполне себе язык для разработки БД. Тем более что БД на Java вполне себе есть, даже opensource :) Проблемы будут со сборкой мусора под нагрузкой, но и они решаемые. Поверю на слово, скорее всего так и есть: там бы это всё выглядело более строго) Но всё-таки java - не технология для написания БЫСТРОЙ Субд. Компилируемые C/C++ в любом случае быстрее. А мне ведь ещё надо было адекватно сравнить с MySql и прочими) ЗЫ А атомарные операции поддерживаются на уровне процессора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2010, 00:32 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
SoFx00 один поток начинает читать индекс, второй тоже хочет читать. Если тупо блокировать работу с индексом - огромное падение производительности, т.к. второй поток вынужден ждать окончания чтения, вместо выполнения параллельно. Поэтому надо вводить 3 состояния - чтение, запись, не_используется и на их основе строить логику новой спинблокировки. Э-э-э... Т.е. ты не читал Рихтера? Там целая глава посвящена именно разводу читателей и писателей. Двумя мутексами. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2010, 00:40 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
авторЭ-э-э... Т.е. ты не читал Рихтера? Там целая глава посвящена именно разводу читателей и писателей. Двумя мутексами. Читал. Но такого если честно не помню. В любом случае задача решена лично мною, без подсказок, причём решение в итоге вышло достаточно изящное... Хотя обидно будет, если убил время на изобретение велосипеда) Ну и к слову, мьютексы использовать для синхронизации внутри одного процесса - плохо. Переключение в режим ядра занимает много процессорного времени) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2010, 00:51 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
авторИз тех вопросов которые он задает 3 качественных курсовых можно сделать. И на диплом и даже на дисерт хватит при должном подходе. ТОЧНО:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2010, 08:27 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
smansdb пишет: > На Java синхронизация многопоточности выполняется элементарно… Это гон. Она везде одинаково сложна. Не сама синхронизация (она везде проста), а проектирование приложения таким образом, чтобы правильно делать синхронизацию. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2010, 11:01 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
SoFx00 пишет: > Java - это не язык для написания быстрой СУБД. Я плохо знаком с явой, но > вряд ли средства синхронизации в ней сильно отличаются от имеющихся на > Win32 и алгоритмических: те же критические секции и проч. Тройной Не сильно отличается. Там есть только высокоуровневые встроенные в язык примитивы синхронизации типа автоматически синхронизированных блоков кода и автоматически синхронизированных методов класса. > спинлок нужен для быстрой многопоточной работы с b+ индексами. Поясню: > один поток начинает читать индекс, второй тоже хочет читать. Если тупо > блокировать работу с индексом - огромное падение производительности, > т.к. второй поток вынужден ждать окончания чтения, вместо выполнения > параллельно. Поэтому надо вводить 3 состояния - чтение, запись, > не_используется и на их основе строить логику новой спинблокировки. На самом деле есть специальные алгоритмы прохода по дереву, которые позволяют не блокировать дерево целиком. А конкретные страницы индекса блокируются обычными блокировками страниц данных в рамках транзакций. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2010, 11:05 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
SoFx00разработать клиент-серверную реляционную СУБД. Это мой КУРСОВОЙ в универе, ничего больше Я фигею, господа. Оказывается есть некий универ, где такая задача это всего лишь курсовой. Если это так, то в стране должны производиться десятки клиент-серверных реляционных СУБД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2010, 11:18 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov Э-э-э... Т.е. ты не читал Рихтера? Там целая глава посвящена именно разводу читателей и писателей. Двумя мутексами. Точно Двумя ? з.ы. Рихтера не читал, но ИМХО это невозможно двумя. Потому мне неизвестна операция( системный вызов) способный атомарно ( за одни вызов) проверить + взвести 2 мутекса одновременно. Все это нужно защищать 3-им мутексом на входе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2010, 11:34 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
Синхронизатор мне неизвестна операция( системный вызов) способный атомарно ( за одни вызов) проверить + взвести 2 мутекса одновременно. WaitForMultipleObjects()? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2010, 12:51 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
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 -мя операциями с разными мутексами, а лучше вообще за один системный вызов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2010, 13:02 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
MasterZiv smansdb пишет: > На Java синхронизация многопоточности выполняется элементарно… Это гон. Она везде одинаково сложна. Не сама синхронизация (она везде проста), а проектирование приложения таким образом, чтобы правильно делать синхронизацию. +1 MasterZiv На самом деле есть специальные алгоритмы прохода по дереву, которые позволяют не блокировать дерево целиком. А конкретные страницы индекса блокируются обычными блокировками страниц данных в рамках транзакций. Искал такие алгоритмы, не нашёл. Ну и времени не было. Насчёт блокировки конкретных страниц - это конечно да, но что делать, если страница дерева расщепляется (ну или сливаются две), а другие потоки где-то рядом? Поэтому делал на уровне работы со всем деревом - чтение (может быть много потоков), запись (только 1 поток), unused. авторЯ фигею, господа. Оказывается есть некий универ, где такая задача это всего лишь курсовой. Если это так, то в стране должны производиться десятки клиент-серверных реляционных СУБД. Вы считаете, что я лгу? Тема - результат моей самоуверенности, универ - в Минске, БГУИР называется. автор проверить + взвести 2 мутекса одновременно. Все это нужно защищать 3-им мутексом на входе. У меня вообще используется один синхронизирующий примитив - одна спинлок-переменная) Приоритет при синхронизации больше у читателей и это лучше для колоночной СУБД, т.к. они select-ориентированные. Ладно, пойду искать в Рихтере вышеназванный пример. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2010, 13:14 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
синхронизатор а лучше вообще за один системный вызов. вроде нашел http://msdn.microsoft.com/en-us/library/ms686360%28VS.85%29.aspx ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2010, 13:16 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
синхронизаторсинхронизатор а лучше вообще за один системный вызов. вроде нашел http://msdn.microsoft.com/en-us/library/ms686360%28VS.85%29.aspx Minimum supported client - Windows Vista Minimum supported server - Windows Server 2008 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2010, 13:27 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
синхронизаторНужно не проверить, а атомарно взвести Что такое "взвести" для мутекса? Не "подождать" ли пока он не освободится? Если ты скормишь ей два мутекса, то она не вернётся пока оба они не будут "взведены". И это системный вызов. Один. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2010, 13:32 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov синхронизаторНужно не проверить, а атомарно взвести Что такое "взвести" для мутекса? Не "подождать" ли пока он не освободится? Если ты скормишь ей два мутекса, то она не вернётся пока оба они не будут "взведены". И это системный вызов. Один. Все равно, что то не сходится. Как проверить оба , а взвести только один ? За один вызов естественно . з.ы. прошу прощения за возможно глупый вопрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2010, 15:35 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
MasterZiv smansdb пишет: > На Java синхронизация многопоточности выполняется элементарно… Это гон. Она везде одинаково сложна. Не сама синхронизация (она везде проста), а проектирование приложения таким образом, чтобы правильно делать синхронизацию. Самый простой вариант "проектирования приложения" для клиент-серверной архитектуры: 1. Взять легкую однопользовательскую СУБД. 2. Разработать анализатор входных запросов для разделения их на два типа SELECT и EDIT (UPDATE, CREATE, INSERT ...). 3. Разработать синхронизирующий модуль. Вы хоть знаете Java? Собственно синхронизирующий объект используется только для операции EDIT. Если эта операция выполняется все остальные потоки ждут в очереди. Один поток соответствует одному пользователю. Что непонятно? Не забывайте это курсовик и не требуется супер-пупер оптимизация. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2010, 22:12 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
SoFx00 wrote: > Искал такие алгоритмы, не нашёл. Ну и времени не было. Насчёт блокировки Кажется есть у Гарсия-молино, Ульман, Уидом. И в Transaction processing by Grey & Bernstain. Хотя точно не помню. > конкретных страниц - это конечно да, но что делать, если страница дерева > расщепляется (ну или сливаются две), а другие потоки где-то рядом? Блокируются все изменяемые страницы. > Поэтому делал на уровне работы со всем деревом - чтение (может быть > много потоков), запись (только 1 поток), unused. В реяльной СУБД тебя бы за такое ... Ну да ладно, для учебного примера и это -- очень и очень здорово. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2010, 10:09 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
MasterZiv > конкретных страниц - это конечно да, но что делать, если страница дерева > расщепляется (ну или сливаются две), а другие потоки где-то рядом? Блокируются все изменяемые страницы. Если меняется размер дерева, то дерево или бренч нужно блокировать целяком, тоже разделяя читателей и писателей. Если при проектировке что то не было учтено, веселая отладка получается, с одной стороны непредсказуемое поведение , с другой дедлоки. В конечном итоге, как правило, синхронизация переписывается с доучтением. MasterZiv > Поэтому делал на уровне работы со всем деревом - чтение (может быть > много потоков), запись (только 1 поток), unused. В реяльной СУБД тебя бы за такое ... Некто Джерик, до такого даже и близко не додумался. Если бы додумался, то на каждой странице рассказывал бы нам о передовых технологиях разделения ресурсов между читателями и писателями и их влияния на супер-производительность. ) MasterZiv Ну да ладно, для учебного примера и это -- очень и очень здорово. +1 Автору респект. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2010, 11:26 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
синхронизатор wrote: > Если меняется размер дерева, то дерево или бренч нужно блокировать целяком, > тоже разделяя читателей и писателей. Что такое "размер дерева" -- не понятно точно так же, как и то, зачем блокировать всё дерево целиком. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2010, 12:47 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
MasterZiv синхронизатор wrote: > Если меняется размер дерева, то дерево или бренч нужно блокировать целяком, > тоже разделяя читателей и писателей. Что такое "размер дерева" -- не понятно точно так же, как и то, зачем блокировать всё дерево целиком. Имеется ввиду ращепление или объединение ветвей, удаление ветвей. Приблизительно сценарий выглядит так : В бренче который ращепляется , объеденяется, удаляется уже есть заблокированные страницы на чтение. Теоретически существует вероятность того , что сессия которая читает листовы блоки ращепляемого ( объединяемого, удаляемого ) бренча и прочитает то, что не совсем соответствует реалиям жизни . То есть прежде чем блокировать страницу, нужно просмотреть не заблокирован ли ее бренч . И наоборот, прежде чем блокировать бренч, нужно проверить все ходящие в него подбренчи и листья на предмет блокировок. Как делать эту проверку, или ждать на блокировке как у ТС, или ставить блокировки на все подчиненные бренчи листья определяется архитектурой взаимодействия нитей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2010, 13:39 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
SoFx00 Тройной спинлок нужен для быстрой многопоточной работы с b+ индексами. Поясню: один поток начинает читать индекс, второй тоже хочет читать. Если тупо блокировать работу с индексом - огромное падение производительности, т.к. второй поток вынужден ждать окончания чтения, вместо выполнения параллельно. Поэтому надо вводить 3 состояния - чтение, запись, не_используется и на их основе строить логику новой спинблокировки. В java для этого используется rwlock http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/locks/ReadWriteLock.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2010, 11:35 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
ну яЯ фигею, господа. Оказывается есть некий универ, где такая задача это всего лишь курсовой. Вообще-то в моём родном универе такую курсовую дают уже второй десяток лет... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2010, 17:57 |
|
||
|
Разработка СУБД, вопросы
|
|||
|---|---|---|---|
|
#18+
MasterZiv SoFx00 wrote: > Искал такие алгоритмы, не нашёл. Ну и времени не было. Насчёт блокировки Кажется есть у Гарсия-молино, Ульман, Уидом. И в Transaction processing by Grey & Bernstain. Хотя точно не помню. > конкретных страниц - это конечно да, но что делать, если страница дерева > расщепляется (ну или сливаются две), а другие потоки где-то рядом? Блокируются все изменяемые страницы. > Поэтому делал на уровне работы со всем деревом - чтение (может быть > много потоков), запись (только 1 поток), unused. В реяльной СУБД тебя бы за такое ... Ну да ладно, для учебного примера и это -- очень и очень здорово. Posted via ActualForum NNTP Server 1.4 А расскажи про реальный мир? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2010, 18:09 |
|
||
|
|

start [/forum/topic.php?all=1&fid=35&tid=1552758]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
35ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
78ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 175ms |

| 0 / 0 |
