SlideShare uma empresa Scribd logo
1 de 47
Baixar para ler offline
Работа со слабоструктурированными
    данными в реляционных СУБД.
      Реализация типов данных
hstore, intarray, xml в СУБД PostgreSQL

                  Самохвалов Николай Александрович
                                           ФУПМ МФТИ
                     «Постгресмен» http://postgresmen.ru
Вместо предисловия...


Задача: спроектировать БД каталога разнородных объектов




                  IRR.ru, раздел «Авто»
Разнородный каталог:
«реляционный» подход №1




 Каталог разнородных данных: 1-й способ реализации
             (Entity-Attribute-Value, EAV)

       Недостатков больше, чем преимуществ:
   3 таблицы, большой объём данных (включая индексы),
необходимость выполнения операции соединения 3-х таблиц
Разнородный каталог:
     «реляционный» подход №2




Каталог разнородных данных: 2-й способ реализации («широкая таблица»)
Разнородный каталог:
                 «забудем» о 1NF*?

                                  item
                       obj_id            INT8            int[] ?
                       item_section_id   INT8
                       item_vendor_id    INT8
                       item_model_id     INT8            anytype[] ?
                       item_year         INT2
                       item_price        NUMERIC(30,6)   xml ?
                       item_props        ???
                                                         hstore ?



Каталог разнородных данных: 3-й способ реализации (массивы, XML, hstore)



 *)
      1NF «по Кодду»
ORDBMS PostgreSQL
●   Расширямость (полноценные встроенные
    пользовательские типы данных)
    –   использование наряду с основными типами
    –   индексная поддержка
    –   конкурентный доступ и восстановление после сбоев
Индексы в PostgreSQL
●   B-tree
●   Hash
●   R-tree
●   GiST (обобщённое поисковое дерево)
●   GIN (обобщённый обратный индекс)
Индексы в PostgreSQL
●   B-tree
●   Hash
●   R-tree – теперь тоже GiST!
●   GiST (обобщённое поисковое дерево)
●   GIN (обобщённый обратный индекс)
Особенности реализации GiST в
             PostgreSQL
●   Ключи переменной длины
●   Композитные ключи
●   Оптимизированный INSERT (однопроходный
    вместо рекурсивного)
●   Concurrency & Recovery!
Что такое GiST?
R-tree




A. Guttman. R-tree: A Dynamic Index Structure for Spatial Search. 1984
GiST: Generalized Search Tree
●   Каждый узел содержит от kM до M ключей (кроме
    корня)
●   Лист: для всех (p, ptr) выполняется предикат p для
    данных по указателю ptr
●   Внутренний узел: для всех (p, ptr) выполняется
    предикат p для данных достижимых при спуске от ptr
●   Дерево сбалансировано
●   Основные методы: SEARCH, INSERT, DELETE


    Joseph M. Hellerstein, Jeffrey F. Naughton and Avi Pfeffer. Generalized
    Search Trees for Database Systems. 1995
Использование GiST:
       7 интерфейсных функций
1. bool equal( Datum a, Datum b)
2. float * penalty( GISTENTRY *origentry, GISTENTRY
  *newentry, float *result )
3. Datum union(GistEntryVector *entryvec, int *size )
4. bool consistent( GISTENTRY *entry, Datum query,
  StrategyNumber strategy )
5. GIST_SPLITVEC * split(GistEntryVector *entryvec,
  GIST_SPLITVEC *v )
6. GISTENTRY * compress( GISTENTRY * in )
7. GISTENTRY * decompress( GISTENTRY * in )
Олег Бартунов, Фёдор Сигаев. Написание расширений для
PostgreSQL с использованием GiST. 2005.
http://citforum.ru/database/postgres/gist/
Применение GiST: RD-tree
                                 {0,1,2,3,5,6,9}   {1,3,4,5,6,7,8,9}




                  {0,5,6,9}   {1,2,3,5,6,9}              {1,3,4,5,6,7,8}   {4,7,9}




{0,9} {0,5,6,9}       {1,2,3,5,6,9} {1,2,5}        {1,4,5,8} {3,5,6,7,8}    {4,7,9}




              Примеры: FTS, contrib/intarray, contrib/hstore, contrib/pg_trgm
Что такое GIN?
Логическая структура GIN для hstore
GIN: 4 интерфейсных функции
●   Datum* extractValue(Datum inputValue, uint32*
    nentries)
●   int compareEntry(Datum a, Datum b)
●   Datum* extractQuery(Datum query, uint32*
    nentries, StrategyNumber n)
●   bool consistent(bool check[], StrategyNumber n,
    Datum query)
Реализация GIN в PostgreSQL
●   Конкурентный доступ
●   Восстановление после сбоев (WAL)
●   Поддерка opclasses, определяемых пользователем
●   Встроенная реализация для массивов (произвольных!),
    полнотекстового поиска
●   B-trees: ET (entries tree), PT (posting tree; if needed)
Типы данных для работы
 со слабоструктурированными
данными: массивы, hstore, xml
Типы данных: массивы
                 CREATE TABLE sal_emp (
                     name            text,
                     pay_by_quarter integer[],
                     schedule        text[][]
                 );




●   Массивы для произвольных типов (начиная с 8.3:
    включая композитные типы, user-defined типы, enums):
    встроенная поддержка GIN
●   contrib/intarray: GiST для int4[] и int8[]
●   Произвольная длина (varlena), значение до 1GB
●   Многомерные массивы
Использование массивов
                      (на примере http://mirtesen.ru)
●   Денормализация
                           obj2geo                            obj
                o2g_geo_obj_id        INT8
                o2g_obj_obj_id        INT8
                o2g_type_did          INT8
                o2g_geo_path_ids      INT8[]
                                                              geo




                                          person
●   Гибкая схема БД
                         obj_id                INT8
                         obj_status_did        INT8
                         obj_created           INT8
                         person_name           VARCHAR(32)
                         person_email          VARCHAR(255)
                         ...
                         person_tags           INT8[]         + GiST/GIN index
Типы данных: hstore
test=# select 'quot;colorquot;=>quot;redquot;,quot;agequot;=>quot;21quot;'::hstore;
           hstore
-----------------------------
 quot;agequot;=>quot;21quot;, quot;colorquot;=>quot;redquot;
(1 row)

test=# select 'quot;colorquot;=>quot;redquot;,quot;agequot;=>quot;21quot;'::hstore->'age';
 ?column?
----------
 21
(1 row)

test=# select akeys('a=>1,b=>2'::hstore);
 akeys
-------
 {a,b}
(1 row)
Функции и операторы hstore
●   akeys(hstore), avals(hstore) – returns
    keys/values as an array
●   skeys(hstore), skeys(hstore) – retunrs
    keys/values as a set of strings
●   each(hstore) – returns set of (key,value)
●   exist(hstore,text), defined(hstore, text) –
    similarly to Perl (undef is NULL)
●   hstore ? text – equivalent for exist()
●   hstore @> hstore, hstore <@ hstore –
    containes/contained operation
●   hstore || hstore - concatenate
Логическая структура GIN для hstore
Использование hstore
      (на примере http://mirtesen.ru)




                     person
    obj_id                INT8
    obj_status_did        INT8
    obj_created           INT8
    person_name           VARCHAR(32)
    person_email          VARCHAR(255)
    ...
    person_data           hstore
Индексирование hstore
●   B-tree: индексирование проекции
    CREATE INDEX ... USING BTREE ((person_data->'age'));



    Плюсы:
    ● Отличная производительность

    ● Простой вид запроса

    ● Запросы с операторами <, <=, >, >=

    ● Можно использовать для сортировки



    Минусы:
    ● Для полноценной индексации требуется 2 индекса (по

    ключам, по значениям)
    ● Только один ключ. Для многих ключей — несколько

    индексов.
Индексирование hstore
●   GiST: CREATE   INDEX ... USING GIST(person_data);



    Плюсы:
    ● Единый индекс

    ● Один indexscan для обработки нескольких

    выражений сразу


    Минусы:
    ● При использовании сигнатур (RD-tree) требуется

    перепроверка найденных значений (false drops problem)
    ● «Скромная» производительность в общем случае

    ● Только для операции равенства
Индексирование hstore
●   GIN: CREATE   INDEX ... USING GIN(person_data);

    Плюсы:
    ● Единый индекс

    ● Один indexscan для обработки нескольких

    выражений сразу
    ● Очень быстрая операция exist

    ● Отличная шкалируемость




    Минусы:
    ● Требуется перепроверка найденных значений (false drops

    problem) для операции contains (но реже, чем в GiST)
    ● Только для операции равенства

    ● Относительно «медленные» INSERTs & UPDATEs

    ● Нет поддержки многоколоночных индексов
PostgreSQL XML type: логический уровень
●   Google Summer of Code (лето 2006) + доработка (2006-2007), Nikolay
    Samokhvalov & Peter Eisentraut
     –   XML type (over VARCHAR)
     –   SQL/XML publishing functions
     –   DTD validation
     –   XPath: xpath(), with namespaces support
     –   XML simple export functions
●   Кроме этого (не требует изменения ядра):
     –   XPath functional indexes
     –   Full-text search (w/o structure awareness)
Созданные патчи приняты, включены в PostgreSQL 8.3 (сейчас beta2) и
  постоянно дорабатываются
Samokhvalov, N. XML Support in PostgreSQL. /Spring Young Researcher's
Colloquium On Database and Information Systems, SYRCoDIS Moscow,
 Russia, 2007
Работа над XML-типом в PostgreSQL: Roadmap


                  логический уровень СУБД
                    XML type, SQL/XML, DTD,
                XPath, functional XPath indexes, GIN




 расширение возможностей
XSLT, XSD, RelaxNG, Annotated
                                        производительность
   schemas decomposition,
                                                ?
    advanced FTS, XQuery
             ...
Производительность xml: задачи
 ●   Выборка всего XML-значения по условию XPath
         SELECT xmlcol
         FROM tbl1
         WHERE (xpath('/a/@b', xmlcol))[1] = '123';

         SELECT xmlcol
         FROM tbl1
         WHERE (xpath('/a[@c=quot;squot;]/@b', xmlcol))[1] = '123';

 ●   Выборка произвольной части XML-значения
         SELECT xpath('/a/@b', xmlcol)
         FROM tbl1
         WHERE id = 111;

 ●   Модификация части XML-значения
Индексирование XML-данных
            (осень 2007)
●   B-tree (для выражений, результатом которых
    является скаляр)
●   GIN
●   Полнотекстовый индекс (без учёта
    структуры)
Производительность: базовые идеи

●   Cache intermediate results to avoid redundant parsing and
    XPath evaluation
●   Advanced physical storage to speedup access to arbitrary node
    in XML data
●   Use PostgreSQL existing capabilities for full-text search
●   Use additional structures/tables/indexes to avoid XPath
    evaluation at runtime
●   Use slices (similar to array_extract_slice()) to avoid dealing with
    entire values (both in SELECTs and UPDATEs)
Развитие структуры хранения
●   4 bytes: VARLENA header bytes
●
    1st TOAST slice (2kb): structure descriptor
●   Other slices: raw data


1st TOAST slice – {pathID, startAddr, endAddr}


pathID – short ID of XML path (all paths are stored in
  database-wide storage table)
startAddr & endAddr – relative addresses of XML
  element edges, bytes
Развитие структуры хранения
Advantages:
●   can skip useless TOAST slices
●   can use beginAddr, endAddr as a simple numbering
    scheme => use GiST/GIN to index
Изучение областей применимости
         XML и hstore
•   Системы документооборота (XML)
•   Электронные библиотеки (XML)
•   Архивы документов (XML)
•   Журнализация операций, регистрация событий (XML, hstore)
•   Неоднородный каталог объектов (XML, hstore)
•   Прототипирование ПО (XML, hstore)
•   Коллектор данных (XML)
Пример 1: журнал действий

              Цель: гибкость схемы
  (возможность быстро добавлять новые свойства)

                   action
       action_id       SERIAL
       action_type_id      INT4
       action_status_id    INT4
       action_person_id    INT4
       action_data     hstore
Пример 2: каталог разнородных объектов


    Цель: работа с объектами с различными наборами свойств




                      IRR.ru, раздел «Авто»
Пример 2: разнородный каталог




  Каталог разнородных данных: 1-й способ реализации
              (Entity-Attribute-Value, EAV)
Пример 2: разнородный каталог




Каталог разнородных данных: 2-й способ реализации («широкая таблица»)
Пример 2: разнородный каталог




 Каталог разнородных данных: 3-й способ реализации (XML, hstore)
Becnhmarks
GiST vs GIN
Фёдор Сигаев, Highload-2007
GiST vs GIN: SELECT
GiST vs GIN: UPDATE
EAV VS wide table VS hstore
 на примере данных http://domnakarte.ru, 100 тыс. объектов недвижимости;
 ноутбук Pentium-M 1.86GHz, 1GB;
 shared_buffers = 250MB
 work_mem = 20MB



                                 «широкая таблица»   EAV        hstore (GiST)   hstore (GIN)
Данные, MB                                52         231              138            138
Индексов+TOASTed, MB                      22         135              6.2            57
Создание индекса, ms                      29871      289043           79137          278000
Простая выборка по условию, ms        1.6 / 202*     6.3 / 368* 79 / ~3000*          48 / 130*
Вставка, ms                               3.4        5                4.8            8




*) Что делать? Рецепт для web-приложений: «Поднимаем» файлы в файловый кэш ОС:
                           dd ... of=/dev/null
Спасибо!
●   http://nikolay.samokhvalov.com
●   http://postgresmen.ru
●   http://postgresql.org
●   ns@postgresmen.ru

Mais conteúdo relacionado

Mais procurados

Chinese Blogger Conference CIC Presentation Slides
Chinese Blogger Conference CIC Presentation SlidesChinese Blogger Conference CIC Presentation Slides
Chinese Blogger Conference CIC Presentation Slides
Denis Yu
 
اف تي بي
اف تي بياف تي بي
اف تي بي
nansyrigan
 

Mais procurados (18)

за Ruby
за Rubyза Ruby
за Ruby
 
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3389
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3389俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3389
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3389
 
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3426
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3426俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3426
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3426
 
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3429
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3429俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3429
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3429
 
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 1959
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 1959俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 1959
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 1959
 
Manusmriti
ManusmritiManusmriti
Manusmriti
 
Boo Programming Language
Boo Programming LanguageBoo Programming Language
Boo Programming Language
 
俄罗斯Gost标准,进出口购买商品目录№RG 3757
俄罗斯Gost标准,进出口购买商品目录№RG 3757俄罗斯Gost标准,进出口购买商品目录№RG 3757
俄罗斯Gost标准,进出口购买商品目录№RG 3757
 
Chinese Blogger Conference CIC Presentation Slides
Chinese Blogger Conference CIC Presentation SlidesChinese Blogger Conference CIC Presentation Slides
Chinese Blogger Conference CIC Presentation Slides
 
俄罗斯Gost标准,进出口购买商品目录№RG 1786
俄罗斯Gost标准,进出口购买商品目录№RG 1786俄罗斯Gost标准,进出口购买商品目录№RG 1786
俄罗斯Gost标准,进出口购买商品目录№RG 1786
 
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3704
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3704俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3704
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3704
 
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3403
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3403俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3403
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3403
 
Companies (Indian Accounting Standards) Amendment Rules, 2016
Companies (Indian Accounting Standards) Amendment Rules, 2016Companies (Indian Accounting Standards) Amendment Rules, 2016
Companies (Indian Accounting Standards) Amendment Rules, 2016
 
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 2132
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 2132俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 2132
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 2132
 
اف تي بي
اف تي بياف تي بي
اف تي بي
 
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3712
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3712俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3712
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3712
 
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3422
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3422俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3422
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3422
 
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3451
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3451俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3451
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3451
 

Semelhante a 20071113 Msu Vasenin Seminar

20070407 Rit2007 Xmltype Samokhvalov
20070407 Rit2007 Xmltype Samokhvalov20070407 Rit2007 Xmltype Samokhvalov
20070407 Rit2007 Xmltype Samokhvalov
Nikolay Samokhvalov
 
OO Design with C++: 1. Inheritance, part 1
OO Design with C++: 1. Inheritance, part 1OO Design with C++: 1. Inheritance, part 1
OO Design with C++: 1. Inheritance, part 1
Dmitry Stillermann
 
Modeling With Uml
Modeling With UmlModeling With Uml
Modeling With Uml
sef2009
 
тупицын Ec2 Rootconf2009
тупицын Ec2 Rootconf2009тупицын Ec2 Rootconf2009
тупицын Ec2 Rootconf2009
Liudmila Li
 
колышкин Rootconf 2009 Openvz
колышкин Rootconf 2009 Openvzколышкин Rootconf 2009 Openvz
колышкин Rootconf 2009 Openvz
Liudmila Li
 
колышкин Rootconf 2009 Openvz
колышкин Rootconf 2009 Openvzколышкин Rootconf 2009 Openvz
колышкин Rootconf 2009 Openvz
Liudmila Li
 

Semelhante a 20071113 Msu Vasenin Seminar (20)

20070407 Rit2007 Xmltype Samokhvalov
20070407 Rit2007 Xmltype Samokhvalov20070407 Rit2007 Xmltype Samokhvalov
20070407 Rit2007 Xmltype Samokhvalov
 
OO Design with C++: 1. Inheritance, part 1
OO Design with C++: 1. Inheritance, part 1OO Design with C++: 1. Inheritance, part 1
OO Design with C++: 1. Inheritance, part 1
 
20070329 Phpconf2007 Training
20070329 Phpconf2007 Training20070329 Phpconf2007 Training
20070329 Phpconf2007 Training
 
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3701
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3701俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3701
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3701
 
Social Bookmarks, Folksonomies–Complex Networks
Social Bookmarks, Folksonomies–Complex NetworksSocial Bookmarks, Folksonomies–Complex Networks
Social Bookmarks, Folksonomies–Complex Networks
 
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3434
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3434俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3434
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3434
 
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3399
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3399俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3399
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3399
 
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3411
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3411俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3411
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3411
 
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3703
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3703俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3703
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3703
 
Modeling With Uml
Modeling With UmlModeling With Uml
Modeling With Uml
 
тупицын Ec2 Rootconf2009
тупицын Ec2 Rootconf2009тупицын Ec2 Rootconf2009
тупицын Ec2 Rootconf2009
 
20070613 Rit2007 Training
20070613 Rit2007 Training20070613 Rit2007 Training
20070613 Rit2007 Training
 
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 2828
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 2828俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 2828
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 2828
 
俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 7647
俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 7647俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 7647
俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 7647
 
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 4103
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 4103俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 4103
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 4103
 
колышкин Rootconf 2009 Openvz
колышкин Rootconf 2009 Openvzколышкин Rootconf 2009 Openvz
колышкин Rootconf 2009 Openvz
 
колышкин Rootconf 2009 Openvz
колышкин Rootconf 2009 Openvzколышкин Rootconf 2009 Openvz
колышкин Rootconf 2009 Openvz
 
Linuxユーザーのための Windows 管理入門
Linuxユーザーのための Windows 管理入門Linuxユーザーのための Windows 管理入門
Linuxユーザーのための Windows 管理入門
 
Cisco collaboration. 8_oktiabria_biznes-trek_litsenzirovanie
Cisco collaboration. 8_oktiabria_biznes-trek_litsenzirovanieCisco collaboration. 8_oktiabria_biznes-trek_litsenzirovanie
Cisco collaboration. 8_oktiabria_biznes-trek_litsenzirovanie
 
C++20 新功能:Concepts & Ranges
C++20 新功能:Concepts & RangesC++20 新功能:Concepts & Ranges
C++20 新功能:Concepts & Ranges
 

Mais de Nikolay Samokhvalov

Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
 Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва... Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
Nikolay Samokhvalov
 
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данныхПромышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Nikolay Samokhvalov
 
The Art of Database Experiments – PostgresConf Silicon Valley 2018 / San Jose
The Art of Database Experiments – PostgresConf Silicon Valley 2018 / San JoseThe Art of Database Experiments – PostgresConf Silicon Valley 2018 / San Jose
The Art of Database Experiments – PostgresConf Silicon Valley 2018 / San Jose
Nikolay Samokhvalov
 
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
Nikolay Samokhvalov
 
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
Nikolay Samokhvalov
 
#PostgreSQLRussia 2015.09.15 - Николай Самохвалов - 5 главных особенностей Po...
#PostgreSQLRussia 2015.09.15 - Николай Самохвалов - 5 главных особенностей Po...#PostgreSQLRussia 2015.09.15 - Николай Самохвалов - 5 главных особенностей Po...
#PostgreSQLRussia 2015.09.15 - Николай Самохвалов - 5 главных особенностей Po...
Nikolay Samokhvalov
 
Три вызова реляционным СУБД и новый PostgreSQL - #PostgreSQLRussia семинар по...
Три вызова реляционным СУБД и новый PostgreSQL - #PostgreSQLRussia семинар по...Три вызова реляционным СУБД и новый PostgreSQL - #PostgreSQLRussia семинар по...
Три вызова реляционным СУБД и новый PostgreSQL - #PostgreSQLRussia семинар по...
Nikolay Samokhvalov
 
2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4
2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.42014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4
2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4
Nikolay Samokhvalov
 
2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels
Nikolay Samokhvalov
 

Mais de Nikolay Samokhvalov (20)

Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
 Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва... Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
 
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данныхПромышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
 
The Art of Database Experiments – PostgresConf Silicon Valley 2018 / San Jose
The Art of Database Experiments – PostgresConf Silicon Valley 2018 / San JoseThe Art of Database Experiments – PostgresConf Silicon Valley 2018 / San Jose
The Art of Database Experiments – PostgresConf Silicon Valley 2018 / San Jose
 
Nancy CLI. Automated Database Experiments
Nancy CLI. Automated Database ExperimentsNancy CLI. Automated Database Experiments
Nancy CLI. Automated Database Experiments
 
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
 
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
 
Database First! О распространённых ошибках использования РСУБД
Database First! О распространённых ошибках использования РСУБДDatabase First! О распространённых ошибках использования РСУБД
Database First! О распространённых ошибках использования РСУБД
 
2016.10.13 PostgreSQL in Russia
2016.10.13 PostgreSQL in Russia2016.10.13 PostgreSQL in Russia
2016.10.13 PostgreSQL in Russia
 
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
 
#noBackend, или Как выжить в эпоху толстеющих клиентов
#noBackend, или Как выжить в эпоху толстеющих клиентов#noBackend, или Как выжить в эпоху толстеющих клиентов
#noBackend, или Как выжить в эпоху толстеющих клиентов
 
#PostgreSQLRussia в банке Тинькофф, доклад №1
#PostgreSQLRussia в банке Тинькофф, доклад №1#PostgreSQLRussia в банке Тинькофф, доклад №1
#PostgreSQLRussia в банке Тинькофф, доклад №1
 
SFPUG 2015.11.20 lightning talk "PostgreSQL in Russia"
SFPUG 2015.11.20 lightning talk "PostgreSQL in Russia"SFPUG 2015.11.20 lightning talk "PostgreSQL in Russia"
SFPUG 2015.11.20 lightning talk "PostgreSQL in Russia"
 
Владимир Бородин: Как спать спокойно - 2015.10.14 PostgreSQLRussia.org meetu...
Владимир Бородин: Как спать спокойно - 2015.10.14 PostgreSQLRussia.org meetu...Владимир Бородин: Как спать спокойно - 2015.10.14 PostgreSQLRussia.org meetu...
Владимир Бородин: Как спать спокойно - 2015.10.14 PostgreSQLRussia.org meetu...
 
#PostgreSQLRussia 2015.09.15 - Николай Самохвалов - 5 главных особенностей Po...
#PostgreSQLRussia 2015.09.15 - Николай Самохвалов - 5 главных особенностей Po...#PostgreSQLRussia 2015.09.15 - Николай Самохвалов - 5 главных особенностей Po...
#PostgreSQLRussia 2015.09.15 - Николай Самохвалов - 5 главных особенностей Po...
 
#PostgreSQLRussia 2015.09.15 - Максим Трегубов, CUSTIS - Миграция из Oracle в...
#PostgreSQLRussia 2015.09.15 - Максим Трегубов, CUSTIS - Миграция из Oracle в...#PostgreSQLRussia 2015.09.15 - Максим Трегубов, CUSTIS - Миграция из Oracle в...
#PostgreSQLRussia 2015.09.15 - Максим Трегубов, CUSTIS - Миграция из Oracle в...
 
Три вызова реляционным СУБД и новый PostgreSQL - #PostgreSQLRussia семинар по...
Три вызова реляционным СУБД и новый PostgreSQL - #PostgreSQLRussia семинар по...Три вызова реляционным СУБД и новый PostgreSQL - #PostgreSQLRussia семинар по...
Три вызова реляционным СУБД и новый PostgreSQL - #PostgreSQLRussia семинар по...
 
2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4
2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.42014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4
2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4
 
2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels
 
2014.10.15 Сергей Бурладян, Avito.ru
2014.10.15 Сергей Бурладян, Avito.ru2014.10.15 Сергей Бурладян, Avito.ru
2014.10.15 Сергей Бурладян, Avito.ru
 
2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia
2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia
2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia
 

Último

EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
Earley Information Science
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
vu2urc
 

Último (20)

Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 

20071113 Msu Vasenin Seminar

  • 1. Работа со слабоструктурированными данными в реляционных СУБД. Реализация типов данных hstore, intarray, xml в СУБД PostgreSQL Самохвалов Николай Александрович ФУПМ МФТИ «Постгресмен» http://postgresmen.ru
  • 2. Вместо предисловия... Задача: спроектировать БД каталога разнородных объектов IRR.ru, раздел «Авто»
  • 3. Разнородный каталог: «реляционный» подход №1 Каталог разнородных данных: 1-й способ реализации (Entity-Attribute-Value, EAV) Недостатков больше, чем преимуществ: 3 таблицы, большой объём данных (включая индексы), необходимость выполнения операции соединения 3-х таблиц
  • 4. Разнородный каталог: «реляционный» подход №2 Каталог разнородных данных: 2-й способ реализации («широкая таблица»)
  • 5. Разнородный каталог: «забудем» о 1NF*? item obj_id INT8 int[] ? item_section_id INT8 item_vendor_id INT8 item_model_id INT8 anytype[] ? item_year INT2 item_price NUMERIC(30,6) xml ? item_props ??? hstore ? Каталог разнородных данных: 3-й способ реализации (массивы, XML, hstore) *) 1NF «по Кодду»
  • 6. ORDBMS PostgreSQL ● Расширямость (полноценные встроенные пользовательские типы данных) – использование наряду с основными типами – индексная поддержка – конкурентный доступ и восстановление после сбоев
  • 7. Индексы в PostgreSQL ● B-tree ● Hash ● R-tree ● GiST (обобщённое поисковое дерево) ● GIN (обобщённый обратный индекс)
  • 8. Индексы в PostgreSQL ● B-tree ● Hash ● R-tree – теперь тоже GiST! ● GiST (обобщённое поисковое дерево) ● GIN (обобщённый обратный индекс)
  • 9. Особенности реализации GiST в PostgreSQL ● Ключи переменной длины ● Композитные ключи ● Оптимизированный INSERT (однопроходный вместо рекурсивного) ● Concurrency & Recovery!
  • 11. R-tree A. Guttman. R-tree: A Dynamic Index Structure for Spatial Search. 1984
  • 12. GiST: Generalized Search Tree ● Каждый узел содержит от kM до M ключей (кроме корня) ● Лист: для всех (p, ptr) выполняется предикат p для данных по указателю ptr ● Внутренний узел: для всех (p, ptr) выполняется предикат p для данных достижимых при спуске от ptr ● Дерево сбалансировано ● Основные методы: SEARCH, INSERT, DELETE Joseph M. Hellerstein, Jeffrey F. Naughton and Avi Pfeffer. Generalized Search Trees for Database Systems. 1995
  • 13. Использование GiST: 7 интерфейсных функций 1. bool equal( Datum a, Datum b) 2. float * penalty( GISTENTRY *origentry, GISTENTRY *newentry, float *result ) 3. Datum union(GistEntryVector *entryvec, int *size ) 4. bool consistent( GISTENTRY *entry, Datum query, StrategyNumber strategy ) 5. GIST_SPLITVEC * split(GistEntryVector *entryvec, GIST_SPLITVEC *v ) 6. GISTENTRY * compress( GISTENTRY * in ) 7. GISTENTRY * decompress( GISTENTRY * in ) Олег Бартунов, Фёдор Сигаев. Написание расширений для PostgreSQL с использованием GiST. 2005. http://citforum.ru/database/postgres/gist/
  • 14. Применение GiST: RD-tree {0,1,2,3,5,6,9} {1,3,4,5,6,7,8,9} {0,5,6,9} {1,2,3,5,6,9} {1,3,4,5,6,7,8} {4,7,9} {0,9} {0,5,6,9} {1,2,3,5,6,9} {1,2,5} {1,4,5,8} {3,5,6,7,8} {4,7,9} Примеры: FTS, contrib/intarray, contrib/hstore, contrib/pg_trgm
  • 17. GIN: 4 интерфейсных функции ● Datum* extractValue(Datum inputValue, uint32* nentries) ● int compareEntry(Datum a, Datum b) ● Datum* extractQuery(Datum query, uint32* nentries, StrategyNumber n) ● bool consistent(bool check[], StrategyNumber n, Datum query)
  • 18. Реализация GIN в PostgreSQL ● Конкурентный доступ ● Восстановление после сбоев (WAL) ● Поддерка opclasses, определяемых пользователем ● Встроенная реализация для массивов (произвольных!), полнотекстового поиска ● B-trees: ET (entries tree), PT (posting tree; if needed)
  • 19. Типы данных для работы со слабоструктурированными данными: массивы, hstore, xml
  • 20. Типы данных: массивы CREATE TABLE sal_emp ( name text, pay_by_quarter integer[], schedule text[][] ); ● Массивы для произвольных типов (начиная с 8.3: включая композитные типы, user-defined типы, enums): встроенная поддержка GIN ● contrib/intarray: GiST для int4[] и int8[] ● Произвольная длина (varlena), значение до 1GB ● Многомерные массивы
  • 21. Использование массивов (на примере http://mirtesen.ru) ● Денормализация obj2geo obj o2g_geo_obj_id INT8 o2g_obj_obj_id INT8 o2g_type_did INT8 o2g_geo_path_ids INT8[] geo person ● Гибкая схема БД obj_id INT8 obj_status_did INT8 obj_created INT8 person_name VARCHAR(32) person_email VARCHAR(255) ... person_tags INT8[] + GiST/GIN index
  • 22. Типы данных: hstore test=# select 'quot;colorquot;=>quot;redquot;,quot;agequot;=>quot;21quot;'::hstore; hstore ----------------------------- quot;agequot;=>quot;21quot;, quot;colorquot;=>quot;redquot; (1 row) test=# select 'quot;colorquot;=>quot;redquot;,quot;agequot;=>quot;21quot;'::hstore->'age'; ?column? ---------- 21 (1 row) test=# select akeys('a=>1,b=>2'::hstore); akeys ------- {a,b} (1 row)
  • 23. Функции и операторы hstore ● akeys(hstore), avals(hstore) – returns keys/values as an array ● skeys(hstore), skeys(hstore) – retunrs keys/values as a set of strings ● each(hstore) – returns set of (key,value) ● exist(hstore,text), defined(hstore, text) – similarly to Perl (undef is NULL) ● hstore ? text – equivalent for exist() ● hstore @> hstore, hstore <@ hstore – containes/contained operation ● hstore || hstore - concatenate
  • 25. Использование hstore (на примере http://mirtesen.ru) person obj_id INT8 obj_status_did INT8 obj_created INT8 person_name VARCHAR(32) person_email VARCHAR(255) ... person_data hstore
  • 26. Индексирование hstore ● B-tree: индексирование проекции CREATE INDEX ... USING BTREE ((person_data->'age')); Плюсы: ● Отличная производительность ● Простой вид запроса ● Запросы с операторами <, <=, >, >= ● Можно использовать для сортировки Минусы: ● Для полноценной индексации требуется 2 индекса (по ключам, по значениям) ● Только один ключ. Для многих ключей — несколько индексов.
  • 27. Индексирование hstore ● GiST: CREATE INDEX ... USING GIST(person_data); Плюсы: ● Единый индекс ● Один indexscan для обработки нескольких выражений сразу Минусы: ● При использовании сигнатур (RD-tree) требуется перепроверка найденных значений (false drops problem) ● «Скромная» производительность в общем случае ● Только для операции равенства
  • 28. Индексирование hstore ● GIN: CREATE INDEX ... USING GIN(person_data); Плюсы: ● Единый индекс ● Один indexscan для обработки нескольких выражений сразу ● Очень быстрая операция exist ● Отличная шкалируемость Минусы: ● Требуется перепроверка найденных значений (false drops problem) для операции contains (но реже, чем в GiST) ● Только для операции равенства ● Относительно «медленные» INSERTs & UPDATEs ● Нет поддержки многоколоночных индексов
  • 29. PostgreSQL XML type: логический уровень ● Google Summer of Code (лето 2006) + доработка (2006-2007), Nikolay Samokhvalov & Peter Eisentraut – XML type (over VARCHAR) – SQL/XML publishing functions – DTD validation – XPath: xpath(), with namespaces support – XML simple export functions ● Кроме этого (не требует изменения ядра): – XPath functional indexes – Full-text search (w/o structure awareness) Созданные патчи приняты, включены в PostgreSQL 8.3 (сейчас beta2) и постоянно дорабатываются Samokhvalov, N. XML Support in PostgreSQL. /Spring Young Researcher's Colloquium On Database and Information Systems, SYRCoDIS Moscow, Russia, 2007
  • 30. Работа над XML-типом в PostgreSQL: Roadmap логический уровень СУБД XML type, SQL/XML, DTD, XPath, functional XPath indexes, GIN расширение возможностей XSLT, XSD, RelaxNG, Annotated производительность schemas decomposition, ? advanced FTS, XQuery ...
  • 31. Производительность xml: задачи ● Выборка всего XML-значения по условию XPath SELECT xmlcol FROM tbl1 WHERE (xpath('/a/@b', xmlcol))[1] = '123'; SELECT xmlcol FROM tbl1 WHERE (xpath('/a[@c=quot;squot;]/@b', xmlcol))[1] = '123'; ● Выборка произвольной части XML-значения SELECT xpath('/a/@b', xmlcol) FROM tbl1 WHERE id = 111; ● Модификация части XML-значения
  • 32. Индексирование XML-данных (осень 2007) ● B-tree (для выражений, результатом которых является скаляр) ● GIN ● Полнотекстовый индекс (без учёта структуры)
  • 33. Производительность: базовые идеи ● Cache intermediate results to avoid redundant parsing and XPath evaluation ● Advanced physical storage to speedup access to arbitrary node in XML data ● Use PostgreSQL existing capabilities for full-text search ● Use additional structures/tables/indexes to avoid XPath evaluation at runtime ● Use slices (similar to array_extract_slice()) to avoid dealing with entire values (both in SELECTs and UPDATEs)
  • 34. Развитие структуры хранения ● 4 bytes: VARLENA header bytes ● 1st TOAST slice (2kb): structure descriptor ● Other slices: raw data 1st TOAST slice – {pathID, startAddr, endAddr} pathID – short ID of XML path (all paths are stored in database-wide storage table) startAddr & endAddr – relative addresses of XML element edges, bytes
  • 35. Развитие структуры хранения Advantages: ● can skip useless TOAST slices ● can use beginAddr, endAddr as a simple numbering scheme => use GiST/GIN to index
  • 36. Изучение областей применимости XML и hstore • Системы документооборота (XML) • Электронные библиотеки (XML) • Архивы документов (XML) • Журнализация операций, регистрация событий (XML, hstore) • Неоднородный каталог объектов (XML, hstore) • Прототипирование ПО (XML, hstore) • Коллектор данных (XML)
  • 37. Пример 1: журнал действий Цель: гибкость схемы (возможность быстро добавлять новые свойства) action action_id SERIAL action_type_id INT4 action_status_id INT4 action_person_id INT4 action_data hstore
  • 38. Пример 2: каталог разнородных объектов Цель: работа с объектами с различными наборами свойств IRR.ru, раздел «Авто»
  • 39. Пример 2: разнородный каталог Каталог разнородных данных: 1-й способ реализации (Entity-Attribute-Value, EAV)
  • 40. Пример 2: разнородный каталог Каталог разнородных данных: 2-й способ реализации («широкая таблица»)
  • 41. Пример 2: разнородный каталог Каталог разнородных данных: 3-й способ реализации (XML, hstore)
  • 43. GiST vs GIN Фёдор Сигаев, Highload-2007
  • 44. GiST vs GIN: SELECT
  • 45. GiST vs GIN: UPDATE
  • 46. EAV VS wide table VS hstore на примере данных http://domnakarte.ru, 100 тыс. объектов недвижимости; ноутбук Pentium-M 1.86GHz, 1GB; shared_buffers = 250MB work_mem = 20MB «широкая таблица» EAV hstore (GiST) hstore (GIN) Данные, MB 52 231 138 138 Индексов+TOASTed, MB 22 135 6.2 57 Создание индекса, ms 29871 289043 79137 278000 Простая выборка по условию, ms 1.6 / 202* 6.3 / 368* 79 / ~3000* 48 / 130* Вставка, ms 3.4 5 4.8 8 *) Что делать? Рецепт для web-приложений: «Поднимаем» файлы в файловый кэш ОС: dd ... of=/dev/null
  • 47. Спасибо! ● http://nikolay.samokhvalov.com ● http://postgresmen.ru ● http://postgresql.org ● ns@postgresmen.ru