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

From: "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org>
To: pgsql-ru-general(at)postgresql(dot)org
Subject: Re: Re: [pgsql-ru-general] Массивы: REFERENCES и выборки
Date: 2012-12-15 08:21:48
Message-ID: 20121215082148.GD5284@vdsl.uvw.ru
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-ru-general

>> было три таблички
>>
>> orders
>> drivers
>>
>> и
>>
>> orders_drivers - oid, did, dist, time
>>
>> за годы работы получается что orders_drivers скопилась огромная.
>>
>> ну и хочется ее свернуть в массивы композитных полей вида
>> (did,dist,time)[] и класть эти массивчики в orders.
>>
>> фича в том что с ордером работа кратковременная, далее он в базе
>> просто лежит.
>>
>> а вот джоин на водителей через промежуточную стомилионную таблицу
>> orders_drivers уже тяжел.

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

SELECT
*
FROM
orders o
JOIN
orders_drivers od ON od.oid = o.id
JOIN
drivers d ON d.id = od.did
WHERE
d.чего-нибудь = чему-нибудь

индексы
o.id - primary
d.id - primary
od.did - btree
od.oid, od.did - btree, unique
d.чего-нибудь - тоже конечно индекс есть

ну и вторая задача от свертки, которую хотим получить - возможность
сносить все в архивную таблицу:
будет orders и orders_archive
вторая будет INHERITS от первой, ну и соответственно кронскриптом
orders что были 5 дней назад будут из первой во вторую выноситься :)

когда имеется дерево взаимозависимостей мне непонятно как такое делать

>> но вот что хочется:
>>
>> 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.

это я читал. но у меня арреи все не интовые а текстовые.
соответственно когда пробуешь построить GIST/GIN индекс просит ops'ы
указать и непонятно какие их туда указывать

--

. ''`. Dmitry E. Oboukhov
: :’ : email: unera(at)debian(dot)org jabber://UNera(at)uvw(dot)ru
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
`- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537

In response to

Responses

Browse pgsql-ru-general by date

  From Date Subject
Next Message Виктор Вислобоков 2012-12-16 11:32:33 Re: [pgsql-ru-general] Массивы: REFERENCES и выборки
Previous Message Sergey Konoplev 2012-12-15 00:05:06 Re: [pgsql-ru-general] Массивы: REFERENCES и выборки