Re: Re: [pgsql-ru-general] Массивы: REFERENCES и выборки
От | Dmitry E. Oboukhov |
---|---|
Тема | Re: Re: [pgsql-ru-general] Массивы: REFERENCES и выборки |
Дата | |
Msg-id | 20121215082148.GD5284@vdsl.uvw.ru обсуждение исходный текст |
Ответ на | Re: [pgsql-ru-general] Массивы: REFERENCES и выборки (Sergey Konoplev <gray.ru@gmail.com>) |
Список | 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@debian.org jabber://UNera@uvw.ru `. `~’ GPGKey: 1024D / F8E26537 2006-11-21 `- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
Вложения
В списке pgsql-ru-general по дате отправления: