2014.12.23 Николай Самохвалов, Ещё раз о json(b) в postgresql 9.4

34
#PostgreSQLRussia Москва, 23.12.2014 PostgreSQL-митап в офисе компании Parallels Ещё раз о JSON(b) в PostgreSQL 9.4 Николай Самохвалов [email protected] Twitter: @samokhvalov

Upload: nikolay-samokhvalov

Post on 17-Jul-2015

1.092 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: 2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4

#PostgreSQLRussiaМосква, 23.12.2014

PostgreSQL-митап в офисе компании Parallels

Ещё раз о JSON(b) в PostgreSQL 9.4

Николай Самохвалов[email protected]

Twitter: @samokhvalov

Page 2: 2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4

● 1998-2007: МФТИ & ИСП РАН● 2006: XML в PostgreSQL (8.3, c Peter

Eisentraut)● с 2007 — «Постгресмен», пресс-

контакт PGDG в России, Highload++● с 2006 — стартапы, ● социальные сети

Обо мне

Page 3: 2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4

● ГАИШ МГУ● PostgreSQL hackers,● major contributors:

○ GiST, GIN ○ hstore, intarray, etc○ full-text search○ kNN-search○ JSON, JSONb

Олег Бартунов и Фёдор Сигаев

Page 4: 2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4

● развитие GiST & GIN● jsquery https://github.com/akorotkov/jsquery

+ Александр Коротков

Page 5: 2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4

JSONb:+ Andrew Dunstan & Peter Geoghegan

Page 6: 2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4

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

Page 7: 2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4

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

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

Page 8: 2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4

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

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

Page 9: 2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4

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

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

Page 10: 2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4

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

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

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

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

Chris Date — развил,

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

Page 11: 2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4

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

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

● Реляционная: конец 60-х … н.в.○ структура (отношения, кортежи)○ целостность○ манипуляции (рел. алгебра / рел.

исчисление)○ принцип ACID○ SQL — с 1970-х (ANSI: 1986, ISO: 1987)

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

Page 12: 2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4

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

Page 13: 2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4

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

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

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

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

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

Page 14: 2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4

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

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

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

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

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

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

Page 15: 2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4

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

● Реляционная: конец 60-х … н.в.● 90е — вызов #1:

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

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

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

2003: тип данных hstore2012: PostgreSQL 9.2 — тип данных JSON2014: PostgreSQL 9.4 — тип данных JSONb

Page 16: 2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4

Пары ключ-значение (без вложенности)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

Page 17: 2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4

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

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

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

JSON в PostgreSQL

Page 18: 2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4

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

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

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

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

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

все эти типы:○ hstore○ XML○ JSON○ JSONb

JSONb в PostgreSQL

Page 19: 2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4

-- 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

Page 20: 2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4

Индексы

Page 21: 2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4

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

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

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

● хэш

Как искать?

Page 22: 2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4

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

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

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

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

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

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

Page 23: 2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4

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

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

Page 24: 2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4

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

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

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

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

PostgreSQL: opclass-ы

Page 25: 2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4

● опкласс по умолчанию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

Page 26: 2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4

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: базовые операторы

Page 27: 2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4

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

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

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

см. далее

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

Page 28: 2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4

Сравнение опклассов 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

Page 29: 2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4

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

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

Page 30: 2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4

Сравнение от EnterpriseDB

Page 31: 2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4

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

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

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

Page 32: 2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4

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

Page 33: 2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4

● О. Бартунов и А. Коротков, JSONb. Материалы митапа в Яндексе. 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

Ссылки

Page 34: 2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4

[email protected]: @samokhvalovSkype: postgresmenhttp://PostgreSQLRussia.orghttp://Postgresmen.ru

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

Спасибо!