Re: [pgsql-ru-general] Массивы: REFERENCES и выборки - Mailing list pgsql-ru-general

From Sergey Konoplev
Subject Re: [pgsql-ru-general] Массивы: REFERENCES и выборки
Date
Msg-id CAL_0b1srrwZ_=ZUQyM+ZbuTBn8GNMgrxaaeOPdGyRxh_9_BbVg@mail.gmail.com
Whole thread Raw
Responses Re: Re: [pgsql-ru-general] Массивы: REFERENCES и выборки  ("Dmitry E. Oboukhov" <unera@debian.org>)
List pgsql-ru-general
2012/12/14 Dmitry E. Oboukhov <unera@debian.org>:
> было три таблички
>
> orders
> drivers
>
> и
>
> orders_drivers - oid, did, dist, time
>
> за годы работы получается что orders_drivers скопилась огромная.
>
> ну и хочется ее свернуть в массивы композитных полей вида
> (did,dist,time)[] и класть эти массивчики в orders.
>
> фича в том что с ордером работа кратковременная, далее он в базе
> просто лежит.
>
> а вот джоин на водителей через промежуточную стомилионную таблицу
> orders_drivers уже тяжел.

Какой именно запрос тормозит, можно посмотреть на него, на explain
analyze и на индексы?

> но вот что хочется:
>
> 1. таки иметь FOREIGN (ну или если это невозможно то хотя бы CHECK, на
> проверку валидности did'ов (наличия их в drivers)

FK/CHECK не получится, триггерами делайте проверку.

> 2. иметь возможность выбрать только одно подзначение массива в массив,
> то есть записи
>
> 1, ..., {(23,222,0.5),(22,332,0.6)}
> 2, ..., {(11,222,27)}
>
> преобразовать выборкой в
>
> 1, ..., {23,22}
> 2, ..., {11}
>
> поодиночке понятно как это сделать. а внутри выборки есть возможность?

SELECT ..., array(SELECT did FROM unnest(drivers_orders_array)) FROM orders ...

> ну и последнее.
> иногда хочется выбрать orders по входящему набору did
>
> как такой столбик проиндексировать лучше?

Сделать отдельное поле drivers_orders_did_array и на него gin индекс.
Чтобы индекс работал см.
http://www.postgresql.org/docs/9.2/interactive/intarray.html.

> ну и похожая про индексы задача:
>
> таблица
>
> тема, сообщение, {метка1,метка2,метка3}
>
> метки хранятся прямо в текстовом виде (когда-то хранили опять же в
> отдельной таблице, потом из за нагрузки денормализовали)
> метки текстовые
>
>
> хочется отвечать на вопрос
>
>     WHERE tags @> {метка1,метка2}
>
> как массивы лучше проиндексировать?

Опять же http://www.postgresql.org/docs/9.2/interactive/intarray.html.

>
> сейчас построили 5 разных индексов по 5 первым меткам...
>
> говорят что
> такое можно GIST/GIN индексом индексировать, но у меня что-то не
> получается правильно такой индекс построить по текстовому массиву.
> можно пример как этими гист/гин пользоваться?
> операции какие-то они хотят, где они описаны?
>
> --
>
> . ''`.                               Dmitry E. Oboukhov
> : :'  :   email: unera@debian.org jabber://UNera@uvw.ru
> `. `~'              GPGKey: 1024D / F8E26537 2006-11-21
>   `- 1B23 D4F8 8EC0 D902 0555  E438 AB8C 00CF F8E2 6537
>
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.10 (GNU/Linux)
>
> iEYEAREDAAYFAlDLuJkACgkQq4wAz/jiZTd2xACg5DAnSoq44ydR2WtLgMvOF6tA
> bJYAoJG9JH0WGooQP4NiAC5HlNUm+jm4
> =EroA
> -----END PGP SIGNATURE-----
>



--
Sergey Konoplev
Database and Software Architect
http://www.linkedin.com/in/grayhemp

Phones:
USA +1 415 867 9984
Russia, Moscow +7 901 903 0499
Russia, Krasnodar +7 988 888 1979

Skype: gray-hemp
Jabber: gray.ru@gmail.com

pgsql-ru-general by date:

Previous
From: "Dmitry E. Oboukhov"
Date:
Subject: Массивы: REFERENCES и выборки
Next
From: "Dmitry E. Oboukhov"
Date:
Subject: Re: Re: [pgsql-ru-general] Массивы: REFERENCES и выборки