MonetDB

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 16:26, 1 марта 2019.
MonetDB
fraimed
Разработчики: MonetDB B.V.
Постоянный выпуск: Aug2018-SP2 / 14 January 2019 года; 6 months ago (2019-01-14)
Состояние разработки: Активное
Написана на: C
Операционная система: Кросс-платформенное
Локализация: Английский язык
Тип ПО: Колонно - ориентированная СУБД[1]
Лицензия: MPL v2.0
Веб-сайт Официальный сайт MonetBD

MonetDB - это колонно-ориентированная система управления базами данных с открытым исходным кодом, разработанная Centrum Wiskunde & Informatica (CWI)[2] в Нидерландах. Она была разработана, чтобы обеспечить высокую производительность сложных запросов к большим базам данных, таким как объединение таблиц, содержащих сотни колонн и миллионы строк. MonetDB применялся в высокопроизводительных приложениях для аналитической обработки данных в режиме онлайн (OLAP)[3], интеллектуального анализа данных, ГИС [4], RDF[5], извлечения текста и выравнивания последовательности обработки.

Обзор

История

Проекты интеллектуального анализа данных в 90-е годы требовали улучшения аналитической поддержки баз данных. Это привело к спин-оффу CWI под названием Data Distilleries, который использовал ранние реализации MonetDB в своем аналитическом наборе. В 2003 году Data Distilleries стала дочерней компанией SPSS, которая, в свою очередь, была приобретена IBM в 2009 году.

MonetDB в его нынешнем виде был впервые создан в 2002 году докторантом Питером Бончем и профессором Мартином Л. Керстеном в рамках исследовательского проекта MAGNUM 1990-х годов в Амстердамском университете. Первоначально он назывался просто Monet, в честь французского художника-импрессиониста Клода Моне. Первая версия в рамках лицензии на программное обеспечение с открытым исходным кодом (измененная версия публичной лицензии Mozilla) была выпущена 30 сентября 2004 года. Когда MonetDB версии 4 был выпущен в домен с открытым исходным кодом, многие расширения базы кода были добавлены командой MonetDB / CWI. К ним относится новый интерфейс SQL, поддерживающий стандарт SQL: 2003.

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

К 2008 году начался следующий проект под названием X100 (MonetDB / X100), который превратился в технологию VectorWise. VectorWise был приобретен корпорацией Actian, интегрирован с базой данных Ingres и продан в качестве коммерческого продукта.

В 2011 году были предприняты серьезные усилия по обновлению кодовой базы MonetDB. Как часть этого, код для ядра MonetDB 4 и его компонентов XQuery был заморожен. В MonetDB 5 части уровня SQL были помещены в ядро. Полученные изменения создали разницу во внутренних API, поскольку он перешел с языка инструкций MonetDB (MIL) на язык ассемблера MonetDB (MAL). Старые, более не поддерживаемые интерфейсы запросов верхнего уровня также были удалены. Первым был XQuery, который опирался на MonetDB 4 и не был портирован на версию 5. Экспериментальная поддержка интерфейса Jaql была удалена с выпуском в октябре 2014 года. С выпуском в июле 2015 года MonetDB получил поддержку только для чтения данных и постоянных индексов. В этом выпуске устаревший модуль потоковых данных DataCell также был удален из основной кодовой базы в попытке упростить код. Кроме того, лицензия была изменена на MPL v2.0.[Источник 1]

Принцип работы

Колоночные СУБД призваны решить проблему неэффективной работы традиционных СУБД в аналитических системах и системах в подавляющим большинством операций типа «чтение». Они позволяют на более дешевом и маломощном оборудовании получить прирост скорости выполнения запросов в 5, 10 и иногда даже в 100 раз, при этом, благодаря компрессии, данные будут занимать на диске в 5-10 раз меньше, чем в случае с традиционными СУБД.

Основная идея колоночных СУБД — это хранение данных не по строкам, как это делают традиционные СУБД, а по колонкам. Это означает, что с точки зрения SQL-клиента данные представлены как обычно в виде таблиц, но физически эти таблицы являются совокупностью колонок, каждая из которых по сути представляет собой таблицу из одного поля. При этом физически на диске значения одного поля хранятся последовательно друг за другом — приблизительно так: [A1, A2, A3], [B1, B2, B3], [C1, C2, C3] и т.д.

Такая организация данных приводит к тому, что при выполнении select в котором фигурируют только 3 поля из 50 полей таблицы, с диска физически будут прочитаны только 3 колонки. Это означает что нагрузка на канал ввода-вывода будет приблизительно в 50/3=17 раз меньше чем при выполнении такого же запроса в традиционной СУБД.

Рисунок 1 – Пример организации базы данных MonetDB

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

Плюсы и минусы MonetDB

Monet DB плюсы:

  • Довольно полная реализация SQL, включая INSERT, UPDATE, DELETE
  • Есть сжатие данных[6]
  • Поддержка транзакций (ОСС)
  • Поддержка Xquery и других интерфейсов к БД

Monet DB минусы:

  • Слабое сжатие данных
  • Относительно медленная загрузка данных

Работа с MonetDB

Установка

Код MonetDB доступен в простых для установки пакетах для системных администраторов. Поддерживаемые платформы с их подробными требованиями отображаются в меню загрузки. Частную установку можно получить, загрузив и скомпилировав исходный дистрибутив. Для этого не нужны привилегии суперпользователя или системного администратора.

После установки программного обеспечения MonetDB вы найдете ряд программ в подкаталоге bin вашего каталога установки.

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

Для пользователя вы можете предпочесть использовать более удобные GUI-программы. Доступно много хороших GUI-программ. Эти общие GUI-программы обычно позволяют подключаться к любой СУБД через стандартный API подключения к базе данных, такой как ODBC или JDBC. MonetDB предоставляет драйвер ODBC и JDBC драйвера. Драйвер JDBC можно использовать для программ, написанных на Java. Есть также библиотеки API подключения к серверу MonetDB, доступные для языков программирования populair, таких как Python, PHP, Perl.

Если вам нужен драйвер MonetDB ODBC или JDBC , вам нужно будет скачать, установить и настроить их в ОС компьютера, где установлена или запущена GUI-программа. Для драйвера ODBC вам потребуются права системного администратора для установки компонентов драйвера MonetDB ODBC . Для драйвера JDBC никакие привилегии системного администратора не требуются, необходимо только загрузить одиночный файл библиотеки jar (архив Java) (такой как monetdb-jdbc-2.24.jar) из области загрузки и настройки в вашей GUI-программе, где хранится файл jar (или добавьте его в настройку среды CLASSPATH или параметр запуска java -cp). Драйвер JDBC MonetDB является 100% чистым драйвером Java, что означает, что тот же драйвер JDBC может быть развернут на всех платформах, которые поддерживают среду выполнения Java (JRE) версии 1.7 или выше.

Пример использования MonetDB

Покажем простой сеанс, включающий создание базы данных, загрузки данных и выполнения запросов:

shell> monetdbd create /path/to/mydbfarm
shell> monetdbd start /path/to/mydbfarm
shell> monetdb create voc
shell> monetdb release voc
shell> mclient -u monetdb -d voc
password:<monetdb>
Welcome to mclient, the MonetDB/SQL interactive terminal (Oct2014-SP1)
Database: MonetDB v11.19.7 (Oct2014-SP1), 'mapi:monetdb://localhost:50000/voc'
Type \q to quit, \? for a list of available commands
auto commit mode: on
sql>SELECT 'hello world';
+---------------+
| single_value  |
+===============+
| hello world   |
+---------------+
1 tuple (0.530ms)
sql>\q

Сигнал command \q или end-of-file <Ctrl-d> завершает соединение с сервером. Изучение богатства функциональных возможностей, предлагаемых MonetDB/SQL, лучше всего начать с использования игрушечной базы данных. Для этого мы используем базу данных VOC,а именно файл voc_dump.zip (542K) gz (519K) bz2 (371K)[7], который представляет собой сжатый файл с инструкциями SQL. После извлечения файла загрузите его содержимое в MonetDB с помощью mclient. Перед загрузкой набора данных VOC рекомендуется ввести пользователя, отличного от выбранного по умолчанию. Новому пользователю предоставляется собственная схема базы данных MonetDB. Предположим, что вы запустили MonetDB с модулем SQL, действуйте следующим образом:

shell> mclient -u monetdb -d voc
password:<monetdb>
sql>CREATE USER "voc" WITH PASSWORD 'voc' NAME 'VOC Explorer' SCHEMA "sys";
sql>CREATE SCHEMA "voc" AUTHORIZATION "voc";
sql>ALTER USER "voc" SET SCHEMA "voc";
sql>\q

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

shell> mclient -u voc -d voc
password:<voc>
sql>START TRANSACTION;
auto commit mode: off

sql>CREATE TABLE test (id int, data varchar(30));
operation successful (0.722ms)

sql>\d
TABLE  voc.test

sql>\d test
CREATE TABLE "voc"."test" (
    "id"   INTEGER,
    "data" VARCHAR(30)
);
sql>CREATE TABLE "voc"."test" ("id" int, "data" varchar(30));
sql>ROLLBACK;
auto commit mode: on

sql>\d

Импорт voc_dump.sql файла в базу данных может быть сделан с помощью текстового интерфейса клиента. Альтернативных способ:

1: shell> mclient -u voc -d voc voc_dump.sql
password:<voc>
2:shell> mclient -u voc -d voc < voc_dump.sql
password:<voc>
3:shell> mclient -u voc -d voc
password:<voc>
sql> \< voc_dump.sql
The VOC data set contains data for around 8000 voyages.
 

sql>\d
TABLE  voc.craftsmen
TABLE  voc.impotenten
TABLE  voc.invoices
TABLE  voc.passengers
TABLE  voc.seafarers
TABLE  voc.soldiers
TABLE  voc.total
TABLE  voc.voyages

Давайте проверим данные, которые мы только что загрузили. Сначала подсчитайте количество строк в таблице voyages.

sql>SELECT count(*) FROM voyages;
+------+
| L1   |
+======+
| 8131 |
+------+

Набор состоит из 8 таблиц, которые привязаны друг к другу с помощью связей внешнего ключа. Таблица voyages является основной таблицей, на которую ссылаются все остальные. Каждая таблица, кроме счетов, имеет первичный ключ, определенный над столбцами number и number_sup. Поскольку таблица счетов содержит ноль или более счетов за рейс (идентифицируется по номеру, number_sub) , ограничение первичного ключа невозможно. Таблицы ремесленников, безучастных, пассажиров, моряков и солдат разделяют одни и те же колонны. Мы можем объединить их всех в одну большую таблицу, чтобы упростить доступ к ним.

sql>CREATE VIEW onboard_people AS
SELECT * FROM (
SELECT 'craftsmen' AS type, craftsmen.* FROM craftsmen
UNION ALL
SELECT 'impotenten' AS type, impotenten.* FROM impotenten
UNION ALL
SELECT 'passengers' AS type, passengers.* FROM passengers
UNION ALL
SELECT 'seafarers' AS type, seafarers.* FROM seafarers
UNION ALL
SELECT 'soldiers' AS type, soldiers.* FROM soldiers
UNION ALL
SELECT 'total' AS type, total.* FROM total
) AS onboard_people_table;

Теперь мы можем вычислить количество записей для каждой группы людей:

sql>\d
TABLE  voc.craftsmen
TABLE  voc.impotenten
TABLE  voc.invoices
VIEW   voc.onboard_people
TABLE  voc.passengers
TABLE  voc.seafarers
TABLE  voc.soldiers
TABLE  voc.total
TABLE  voc.voyages
sql>SELECT type, COUNT(*) AS total 
FROM onboard_people GROUP BY type ORDER BY type;
+------------+-------+
| type       | total |
+============+=======+
| craftsmen  |  2349 |
| impotenten |   938 |
| passengers |  2813 |
| seafarers  |  4468 |
| soldiers   |  4177 |
| total      |  2467 |
+------------+-------+

Теперь посмотрим количество людей из какой-нибудь группы:

sql>SELECT count(*) FROM impotenten;
+------+
| L1   |
+======+
|  938 |
+------+

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

sql>SELECT COUNT(*) FROM voyages
WHERE particulars LIKE '%_recked%';
+------+
| L1   |
+======+
|  358 |
+------+
sql>SELECT chamber, CAST(AVG(invoice) AS integer) AS average
FROM invoices
WHERE invoice IS NOT NULL
GROUP BY chamber
ORDER BY average DESC;
+---------+---------+
| chamber | average |
+=========+=========+
| A       |  282996 |
| Z       |  259300 |
| H       |  150182 |
| R       |  149628 |
| D       |  149522 |
| E       |  149518 |
| null    |   83309 |
+---------+---------+
sql>CREATE VIEW extended_onboard AS
SELECT number, number_sup, trip, trip_sup,
    onboard_at_departure, death_at_cape,
    left_at_cape, onboard_at_cape,
    death_during_voyage, onboard_at_arrival,
    death_during_voyage - left_at_cape AS death_at_arrival
FROM onboard_people;
sql>\d
TABLE  voc.craftsmen
VIEW   voc.extended_onboard
TABLE  voc.impotenten
TABLE  voc.invoices
VIEW   voc.onboard_people
TABLE  voc.passengers
TABLE  voc.seafarers
TABLE  voc.soldiers
TABLE  voc.total
TABLE  voc.voyages

Работа с MonetDB в Windows

В Windows первым шагом является инициализация сервера MonetDB, просто открыв: 'Start -> Programs -> MonetDB -> Start server'.

Впоследствии вы можете запустить текстовый интерфейс (mclient) , открыв: 'Start -> Programs -> MonetDB -> SQL client'. Команды, введенные там, идентичны тем, которые находятся на других платформах. Чтобы остановить сервер, можно просто закрыть окно MonetDB SQL Server.

Сервер по умолчанию принимает только соединения из локального узла. Если для доступа к базе данных требуются другие машины, измените файл конфигурации, задав mapi_open=yes..[Источник 2]

Источники

  1. История MonetDB // Официальный сайт MonetDB. [2008-2019]. URL: https://www.monetdb.org/AboutUs (дата обращения: 21.02.2019).
  2. Руководство пользователя // Официальный сайт MonetDB. [2008-2019]. URL: https://www.monetdb.org/Documentation/UserGuide (дата обращения: 21.02.2019).

Примечания