MiksIr
miksir@home:~$
Так, стоп.. а там AND или OR по критериям требуется? Если AND - что-то не соображу как красиво это выбрать...
-~{}~ 24.10.09 00:16:
Если OR - то судя по explain поиск по массиву значительно веселее.
-~{}~ 26.10.09 15:09:
Фирмы (t1) - 1 000 000 записей. Услуги (t2) - 100. Таблица связей - у каждой фирмы все услуги (100 000 000 записей).
-~{}~ 24.10.09 00:16:
Если OR - то судя по explain поиск по массиву значительно веселее.
-~{}~ 26.10.09 15:09:
Фирмы (t1) - 1 000 000 записей. Услуги (t2) - 100. Таблица связей - у каждой фирмы все услуги (100 000 000 записей).
Код:
postgres=# \d t1
Table "postgres.t1"
Column | Type | Modifiers
--------+------------------------+-----------
id | integer | not null
name | character varying(200) |
t2 | integer[] |
Indexes:
"t1_pkey" PRIMARY KEY, btree (id)
"t1_t2_idx" gin (t2)
postgres=# \d t1to2
Table "postgres.t1to2"
Column | Type | Modifiers
--------+---------+-----------
id_t1 | integer |
id_t2 | integer |
Indexes:
"t1to2_t1_idx" btree (id_t1)
"t1to2_t2_idx" btree (id_t2)
postgres=# select count(distinct t1.id) from t1 left join t1to2 on (t1.id=t1to2.id_t1) where t1to2.id_t2 IN (5,44,66,78,99);
count
---------
1000000
(1 row)
Time: 270618.443 ms
postgres=# select count(id) from t1 where t2 && '{5,44,66,78,99}'::integer[];
count
---------
1000000
(1 row)
Time: 34096.289 ms
Давай не сваливать в одну кучу AND и OR выборки - они уж очень разные. В случае OR и JOIN-а от дублирующихся записей не избавиться без distinct-а.