![Page 1: Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных атрибутов, Андрей Аркаев, Naumen](https://reader030.vdocuments.site/reader030/viewer/2022012315/58aa89fb1a28ab2e448b60e5/html5/thumbnails/1.jpg)
Хранение NoSQL данныхв Oracle и PostgreSQL
Аркаев Андрей
![Page 2: Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных атрибутов, Андрей Аркаев, Naumen](https://reader030.vdocuments.site/reader030/viewer/2022012315/58aa89fb1a28ab2e448b60e5/html5/thumbnails/2.jpg)
Чем занимаемся
Naumen Contact Center
→ Звонок (вх/исх)→ Распределение на оператора→ Заполнение анкеты→ Сохранение в БД→ Отчёты
![Page 3: Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных атрибутов, Андрей Аркаев, Naumen](https://reader030.vdocuments.site/reader030/viewer/2022012315/58aa89fb1a28ab2e448b60e5/html5/thumbnails/3.jpg)
Анкета
![Page 4: Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных атрибутов, Андрей Аркаев, Naumen](https://reader030.vdocuments.site/reader030/viewer/2022012315/58aa89fb1a28ab2e448b60e5/html5/thumbnails/4.jpg)
Наши требования
3 млн звонков с анкетами в сутки 20 атрибутов на каждую анкету сложная иерархия форм анкеты
(сотни разных анкет и форм) PostgreSQL, Oracle >= 10g Скорость открытия 2с 1000 операторов
![Page 5: Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных атрибутов, Андрей Аркаев, Naumen](https://reader030.vdocuments.site/reader030/viewer/2022012315/58aa89fb1a28ab2e448b60e5/html5/thumbnails/5.jpg)
Хранение атрибутов в отдельной таблице
anketa: id card_id creationDate …
attr_card: card_id
attr: card_id property_id str_value1 str_value2 date_value dbl_value int_value clob_value
![Page 6: Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных атрибутов, Андрей Аркаев, Naumen](https://reader030.vdocuments.site/reader030/viewer/2022012315/58aa89fb1a28ab2e448b60e5/html5/thumbnails/6.jpg)
Хранение атрибутов в отдельной таблице
anketa: id other_value creationDate …
attr: ank_id (→anketa.id) property_id str_value1 str_value2 date_value dbl_value int_value clob_value
![Page 7: Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных атрибутов, Андрей Аркаев, Naumen](https://reader030.vdocuments.site/reader030/viewer/2022012315/58aa89fb1a28ab2e448b60e5/html5/thumbnails/7.jpg)
Плюсы и минусы
+ схема данных фиксирована+ можно использовать для разных классов
- много данных- сложно партиционировать- значения хранятся в конкретном виде- много null-значений- большие индексы
![Page 8: Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных атрибутов, Андрей Аркаев, Naumen](https://reader030.vdocuments.site/reader030/viewer/2022012315/58aa89fb1a28ab2e448b60e5/html5/thumbnails/8.jpg)
Хранение атрибутов столбцами
anketa: Id creationDate ... NewAttr1 NewAttr2 NewAttr3 ...
anketa: id ... NewAttr5000 ...
![Page 9: Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных атрибутов, Андрей Аркаев, Naumen](https://reader030.vdocuments.site/reader030/viewer/2022012315/58aa89fb1a28ab2e448b60e5/html5/thumbnails/9.jpg)
Хранение атрибутов столбцами
anketa: Id creationDate ... NewAttr1
anketa_type1 obj_id (->anketa.id) NewAttr2 NewAttr3
anketa_type2 obj_id (->anketa.id) NewAttr4 NewAttr5
![Page 10: Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных атрибутов, Андрей Аркаев, Naumen](https://reader030.vdocuments.site/reader030/viewer/2022012315/58aa89fb1a28ab2e448b60e5/html5/thumbnails/10.jpg)
Плюсы и минусы
+ любой тип данных+ индексы на нужные столбцы+ партицион-е
- ограничено количество атрибутов- тяжелое удаление- неудобные запросы- блокировки схемы
![Page 11: Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных атрибутов, Андрей Аркаев, Naumen](https://reader030.vdocuments.site/reader030/viewer/2022012315/58aa89fb1a28ab2e448b60e5/html5/thumbnails/11.jpg)
Что использовать
PostgreSQL >= 9.4 : json или jsonb Oracle >=10g : xmltype (clob) Oracle 11g : xmltype (binary xml) MsSQL 2014 : xml MySQL : -
![Page 12: Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных атрибутов, Андрей Аркаев, Naumen](https://reader030.vdocuments.site/reader030/viewer/2022012315/58aa89fb1a28ab2e448b60e5/html5/thumbnails/12.jpg)
JSON
{ "form1": { "nickname": "Superman", "name": "Кларк Кент", "alias": [ "Человек из стали",
"Последний сын Криптона", "Человек завтрашнего дня" ],
"height": 190, "weight": 106, "alien": true }, … }
![Page 13: Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных атрибутов, Андрей Аркаев, Naumen](https://reader030.vdocuments.site/reader030/viewer/2022012315/58aa89fb1a28ab2e448b60e5/html5/thumbnails/13.jpg)
Получение в PostgreSQL
Создание столбца:
alter table test_table add column attrData jsonb; Получение значения:
SELECT attrData->’form3’->>’title’FROM test_table
![Page 14: Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных атрибутов, Андрей Аркаев, Naumen](https://reader030.vdocuments.site/reader030/viewer/2022012315/58aa89fb1a28ab2e448b60e5/html5/thumbnails/14.jpg)
XML
<?xml version="1.0" encoding="UTF-8"?><root> <form1> <nickname>Superman</nickname> <name>Кларк Кент</name> <alias>Человек из стали</alias> <alias>Последний сын Криптона</alias> <alias>Человек завтрашнего дня</alias> <height>190</height> <weight>106</weight> <alien>true</alien> </form1> ...
![Page 15: Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных атрибутов, Андрей Аркаев, Naumen](https://reader030.vdocuments.site/reader030/viewer/2022012315/58aa89fb1a28ab2e448b60e5/html5/thumbnails/15.jpg)
Получение в Oracle
Создание столбца:
alter table test_tableadd column attrData xmltype;
Получение значения:SELECT extractValue(jsonData,'/root/form3/title'),extract(jsonData,'...').getStringVal(),extract(jsonData,'...').getNumVal(),extract(jsonData,'...').getClobVal()FROM test_table
![Page 16: Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных атрибутов, Андрей Аркаев, Naumen](https://reader030.vdocuments.site/reader030/viewer/2022012315/58aa89fb1a28ab2e448b60e5/html5/thumbnails/16.jpg)
Плюсы и минусы
+ не нужны join+ любое количество атрибутов+ удобнее получать значения ч/з SQL+ история+ партицион-е
- разный синтаксис у разных БД- тип данных: строка- нет FK- Oracle 4Кб
![Page 17: Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных атрибутов, Андрей Аркаев, Naumen](https://reader030.vdocuments.site/reader030/viewer/2022012315/58aa89fb1a28ab2e448b60e5/html5/thumbnails/17.jpg)
Получение массивов в PostgreSQL
SELECT attrData→'form1'→'alias'FROM test_table
["Человек из стали", "Последний сын Криптона", "Человек завтрашнего дня"]
![Page 18: Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных атрибутов, Андрей Аркаев, Naumen](https://reader030.vdocuments.site/reader030/viewer/2022012315/58aa89fb1a28ab2e448b60e5/html5/thumbnails/18.jpg)
Получение массивов в Oracle
select alias.COLUMN_VALUE FROM test_table, TABLE( XMLSequence( extract(attrData, '/root/form1/alias'))) alias
"Человек из стали" "Последний сын Криптона" "Человек завтрашнего дня"
![Page 19: Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных атрибутов, Андрей Аркаев, Naumen](https://reader030.vdocuments.site/reader030/viewer/2022012315/58aa89fb1a28ab2e448b60e5/html5/thumbnails/19.jpg)
Индексы
PostgreSQL Gin-индекс
Oracle ctxsys.ctxxpath XMLIndex (Oracle 11g)
![Page 20: Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных атрибутов, Андрей Аркаев, Naumen](https://reader030.vdocuments.site/reader030/viewer/2022012315/58aa89fb1a28ab2e448b60e5/html5/thumbnails/20.jpg)
Индекс в PostgreSQL
CREATE INDEX idxginp ON test_table USING gin (attrData jsonb_path_ops) SELECT * FROM test_table WHERE attrData @> '{"form1": { "nickname" : "Superman"}}'
![Page 21: Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных атрибутов, Андрей Аркаев, Naumen](https://reader030.vdocuments.site/reader030/viewer/2022012315/58aa89fb1a28ab2e448b60e5/html5/thumbnails/21.jpg)
Индекс в Oracle
CREATE INDEX idx_attrdata ON test_table(attrData) indextype is ctxsys.ctxxpath SELECT * FROM test_table WHERE existsNode(attrData, '/root/form1/nickname="Superman"')=1
![Page 22: Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных атрибутов, Андрей Аркаев, Naumen](https://reader030.vdocuments.site/reader030/viewer/2022012315/58aa89fb1a28ab2e448b60e5/html5/thumbnails/22.jpg)
Результаты PostgreSQL
После
До
0 10 20 30 40 50 60 70
ИндексыАтрибутыАнкета
![Page 23: Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных атрибутов, Андрей Аркаев, Naumen](https://reader030.vdocuments.site/reader030/viewer/2022012315/58aa89fb1a28ab2e448b60e5/html5/thumbnails/23.jpg)
Результаты Oracle
После 11g
После
До
0 10 20 30 40 50 60 70
ИндексыАтрибутыАнкета
![Page 24: Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных атрибутов, Андрей Аркаев, Naumen](https://reader030.vdocuments.site/reader030/viewer/2022012315/58aa89fb1a28ab2e448b60e5/html5/thumbnails/24.jpg)
Итоги перехода
1. Быстрая выборка и обновление2. Скорость выборки 1.6c → 0.35c3. Меньшая деградация скорости БД4. Ускорение импорта в 3 раза5. Снижение нагрузки на CPU и
требования к железу6. Уменьшение размера БД7. “Человеческий” формат данных
![Page 25: Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных атрибутов, Андрей Аркаев, Naumen](https://reader030.vdocuments.site/reader030/viewer/2022012315/58aa89fb1a28ab2e448b60e5/html5/thumbnails/25.jpg)
Планы на будущее
1. Партиционирование2. Шардинг3. Возможность перейти на честные
NoSQL БД