Три вызова реляционным СУБД и новый postgresql - #postgresqlrussia...

50
Москва, 18.02.2015 Три вызова реляционным СУБД и новый PostgreSQL Николай Самохвалов «Постгресмен» Российское сообщество пользователей PostgreSQL [email protected] Twitter: @postgresmen hashtag: #PostgreSQLRussia

Upload: nikolay-samokhvalov

Post on 16-Jul-2015

370 views

Category:

Technology


3 download

TRANSCRIPT

Москва, 18.02.2015

Три вызова реляционным СУБД и новый PostgreSQL

Николай Самохвалов

«Постгресмен»Российское сообщество пользователей PostgreSQL

[email protected]

Twitter: @postgresmenhashtag: #PostgreSQLRussia

⋄ 1998-2007: МФТИ & ИСП РАН

⋄ 2006: XML в PostgreSQL(версия 8.3, c Peter Eisentraut)

⋄ с 2007 — пресс-контакт PostgreSQL в России, секция БД на РИТ++ и Highload++

⋄ Интернет-стартапы, социальные сети (с 2005)

Обо мне

Кто использует в России?

РСУБД, SQL и все-все-все

Иерархическая модель

Модели данных и история

Сетевая модель

Модели данных и история

Реляционная модель

Модели данных и история

⋄ Иерархическая и сетевая:50-е … середина 70-х

⋄ Реляционная: конец 60-х … н.в.○ реляционная алгебра

Модели данных: история

Edgar Codd— основал (1969-1970)

Chris Date — развил,

популяризировал

Модели данных: хронология

⋄ Иерархическая и сетевая:50-е … середина 70-х

⋄ Реляционная: конец 60-х … н.в.○ структура (отношения, кортежи)○ целостность○ манипуляции (рел. алгебра / рел. исчисление)○ принцип ACID○ SQL — с 1970-х (ANSI: 1986, ISO: 1987)

PostgreSQL — преемник Ingres (UCB - Berkeley, CA), SQL – с 1995

Три вызова РСУБД

Реляционная модель: вызов #1

⋄ Реляционная: конец 60-х … н.в.○ реляционная алгебра

⋄ 90е — вызов #1: реляционная модель VS объектная модель

→ объектные СУБД, объектно-реляционный подход

PostgreSQL — объектно-реляционная СУБД:⋄ объекты: БД, схемы, таблицы, индексы и т.д.⋄ расширяемость: типы данных, операторы, методы доступа⋄ наследование

Реляционная модель: вызов #2

⋄ Реляционная: конец 60-х … н.в.○ реляционная алгебра

⋄ 90е — вызов #1: реляционная модель VS объектная модель

⋄ конец 90-х … середина 2000-х — вызов #2: XML («слабоструктурированные», иерархия!)

→ интеграция XML, XML СУБД

2008: PostgreSQL 8.3 — тип данных XML

Реляционная модель: вызов #3⋄ Реляционная: конец 60-х … н.в.⋄ 90е — вызов #1:

реляционная модель VS объектная модель

⋄ конец 2000-х — 2010-е— вызов #2: noSQL & JSON

→ noSQL СУБД: key-value, document-oriented и т.д. — «очень» слабоструктурированные(иерархии! графы!)

2003: тип данных hstore, числовые и текстовый массивы2012: PostgreSQL 9.2 — тип данных JSON2014: PostgreSQL 9.4 — тип данных JSONb

via @edd & @markmadsen (Twitter)

Вариант трактовки понятия NoSQL

PostgreSQL и конкуренция

200x: ⋄ MySQL vs PostgreSQL

201x: ⋄ PostgreSQL vs. Mongo⋄ PostgreSQL vs. Oracle

Holy Wars XXI-го века

2008: Sun покупает MySQL AB

Краткая историческая справка

покупает

а значит и

Краткая историческая справка

переходитс на

Краткая историческая справка

Народное творчество. Sorry, MySQL :-)

NoSQL в PostgreSQL

– с 2003 года!

Пары ключ-значение (без вложенности)SELECT * FROM test LIMIT 1;

id | value

----+--------------------------------------------------------------------

1 | "33"=>"923", "262"=>"181", "471"=>"658", "554"=>"916", "579"=>"472"

⋄ Бинарное хранение⋄ Богатая поддержка индексов (см. далее)

○ функциональные индексы○ GiST○ GIN

hstore: хранение key-valueв реляционной среде

Schema-less PostgreSQL

⋄ Хранится в виде текста (как и XML)⋄ Сохраняет представление

○ порядок, ○ пробелы, ○ дубликаты)

⋄ Индексы — только функциональные

JSON в PostgreSQL

⋄ Хранится бинарном виде /* как и hstore */

⋄ Убираются пробелы⋄ Убираются дубликаты

(берутся последние значения)

⋄ Ключи сортируются /* внутренняя кухня, порядок не определён */

○ быстрый поиск⋄ Результат — в PostgreSQL 9.4 есть все

эти «NoSQL» типы:○ hstore○ числовые и строковые массивы○ XML○ JSON, JSONb

JSONb в PostgreSQL

-- JSONовскый примитивный тип данных "число" — аналог NUMERIC:SELECT '5'::jsonb = '5'::jsonb

-- Например так:SELECT '["a", "b", 77]'::jsonb != '["a", "b", 77.00000000000000000000001]'::jsonb;

-- Конечно же, нули в конце не имеют значения:SELECT '66'::jsonb = '66.000'::jsonb;

-- Строковые примитивы ведут себя как постгресовые строки:SELECT j FROM jdocs ORDER BY j->'name' LIMIT 10;

«Теневая» типизация в jsonb

⋄ PL/v8 – функции, хранимые процедуры на JavaScript

⋄ ToroDB – открытая JSON-СУБД на основе Постгреса

⋄ jsquery – язык запросов для JSON-данных (поддерживает GIN)

Активное развитие JSON в PostgreSQL

Индексы

⋄ линейный поиск, перебор (seqscan) - O(n)

⋄ двоичное дерево

⋄ АВЛ-деревья

⋄ хэш

Как искать?

⋄ B+-деревья○ <, >, =

⋄ R-деревья○ включён, включает,

пересекается

⋄ GiST — обобщённое дерево!Hellerstein, 1995

○ произвольные операторы○ реализовано в PostgreSQL

Как искать: ближе к СУБД, ближе к PostgreSQL

По сравнению с GiST:⋄ намного быстрее поиск⋄ медленнее вставка

GIN - обобщённый инвертированный индекс

⋄ opclass (operator class) – «связь» между типом данных и индексом

⋄ btree, hash — опклассы «по умолчанию» для скалярных типов

→ можно строить функциональные индексы над JSON и JSONb

CREATE INDEX i_test ON table1 USING (btree(выражение));

PostgreSQL: opclass-ы

⋄ опкласс по умолчаниюCREATE INDEX i_test ON table1

USING gin(jcol);

⋄ jsonb_path_opsCREATE INDEX i_test ON table1

USING gin(jcol jsonb_path_ops);

○ НАМНОГО меньше места○ не поддерживает оператор «?»

(«существует»), т.е. менее гибок, чем опкласс по умолчанию

GIN-индексирование jsonb

jsonb @> jsonb — содержит ли значение слева в себе значение справа?'{"a":1, "b":2}'::jsonb @> '{"b":2}'::jsonb

jsonb <@ jsonb — содержится ли левое значение внутри правого значения?'{"b":2}'::jsonb <@ '{"a":1, "b":2}'::jsonb

jsonb ? text — существует ли пара ключ-значение в JSON-значении?'{"a":1, "b":2}'::jsonb ? 'b'

?| text[] — существуют ли хоть какие-то из эти пар ключ-значение?'{"a":1, "b":2, "c":3}'::jsonb ?| array['b', 'c']

?& text[] — существуют ли все приведённые пары ключ-значение?'["a", "b"]'::jsonb ?& array['a', 'b']

jsonb: базовые операторы

⋄ jsonb_path_ops лучше подходит для вложенных структур, чем «дефолтовый» GIN

⋄ почти всегда лучше выбрать jsonb_path_ops, но внимательнее с используемыми операторами!

⋄ можно использовать «функциональный» подход для сужения области индексации!

+ см. далее

Индекс для JSONb — что выбрать?

Сравнение опклассов GIN для jsonb

● БД Delicios● Табличный размер jsonb: 1.3 GB● «Дефолтовый» jsonb_ops: 636 MB

(без компрессии — 815 MB)● jsonb_path_ops: 295 MB● jsonb_path_ops (tags): 44 MB

… USING gin((jb->'tags') jsonb_path_ops)

● jsonb_path_ops (tags.term): 1.6 MB

Сравнение опклассов + Mongo

Подробнее — http://postgresmen.ru/meetup/2014-09-24-yandex

Ещё сравнение (место на диске)

https://wiki.postgresql.org/images/b/b4/Pg-as-nosql-pgday-fosdem-2013.pdfhttp://www.slideshare.net/nosys/billion-tables-project-nycpug-2013

Sorry, MongoDB :-)

Вариант 1 («text»):

table doc_tags_text ( doc_id int not null references documents(doc_id), tag text not null)unique index doc_tags_text_doc_id_tag on (doc_id, tag)index doc_tags_text_tag on (tag)

Вариант 2 («ids»):

table tags ( tag_id serial not null primary key, tag text not null unique

)

table doc_tags_id ( doc_id int not null references documents(doc_id), tag_id int not null references tags(tag_id)

)unique index doc_tags_id_doc_id_tag_id on (doc_id, tag_id)index doc_tags_id_tag_id on (tag_id)

Практический пример: теги (by Josh Berkus)

Вариант 3 («jsonb»):

table doc_tags_json ( doc_id int not null references documents(doc_id), tags jsonb)unique index doc_tags_id_doc_id on (doc_id)index doc_tags_id_tags using gin (tags)

Вариант 4 («array»):

table doc_tags_array ( doc_id int not null references documents(doc_id), tags text[] not null default '{}')unique index doc_tags_id_doc_id on (doc_id)index doc_tags_id_tags using gin (tags)

Практический пример: теги

Теги. Сравнение 4 вариантов реализации.Место на диске

http://www.databasesoup.com/2015/01/tag-all-things-part-2.html

Теги. Сравнение 4 вариантов реализации.Время отклика (запрос по 1 тегу и 9 тегам)

http://www.databasesoup.com/2015/01/tag-all-things-part-2.html

Теги. Сравнение 4 вариантов реализации.Время отклика, постраничный вывод

http://www.databasesoup.com/2015/01/tag-all-things-part-2.html

Теги. Сравнение 4 вариантов реализации.Время отклика (запрос по 2 тегам)

http://www.databasesoup.com/2015/01/tag-all-things-part-3.html

Что же такое PostgreSQL?

⋄ по-прежнему ОРСУБД, очень гибкая, надёжная и производительная

⋄ богатые и активно развивающиеся NoSQL-возможности

⋄ платформа для разработки решений различной сложности и гибкости

Самая развитая из открытых систем баз данных в мире:

⋄ Open Source (своя лицензия, близкая BSD/MIT)

⋄ ОТКРЫТЫЙ процесс разработки (вас услышат!)

⋄ ОРСУБД, ACID, ISO/ANSI SQL, огромное число расширений, типов данных и индексов

⋄ Доступна везде○ Linux: apt-get install postgresql

(или yum install и т.д.)

○ Mac OS: brew install postgres (или используйте Postgres.app)

○ Windows: используйте инсталляторы(click-click-ok-ok-next-next)

⋄ http://PostgreSQL.org⋄ Twitter: @postgresmen⋄ http://postgresmen.ru⋄ http://PostgreSQLRussia.org⋄ Материалы митапа в Яндексе http://postgresmen.ru/meetup/2014-09-

24-yandex⋄ Peter Geoghegan. jsonb Deep Dive. Материалы митапа в Сан-Франциско

(англ.) https://speakerd.s3.amazonaws.com/presentations/a79cd060deb20131ffed2ad9291baba4/jsonb-deep-dive.pdf

⋄ PostgreSQL as a Schemaless Database. Christophe Pettus PostgreSQL Experts, Inc. (англ.) http://thebuild.com/presentations/pg-as-nosql-pgday-fosdem-2013.pdf

⋄ Open Enterprise: The PostgreSQL Open Source Database Blog from EnterpriseDB http://blogs.enterprisedb.com/2014/09/24/postgres-outperforms-mongodb-and-ushers-in-new-developer-reality/

⋄ Крис Дейт. Введение в системы баз данных http://www.ozon.ru/context/detail/id/2309312/

⋄ Материалы митапов #PostgreSQLRussia http://postgresmen.ru/articles⋄ Доклады PGConf.RU 2015 http://pgconf.ru/papers

Ссылки

Николай Самохвалов

[email protected]

Twitter: @postgresmen

Skype: postgresmen

http://PostgreSQLRussia.orghttp://Postgresmen.ru

Спасибо!