Postgresql 9.3
У меня есть две таблицы data_prf
с 200.000 и data_prf_norm
с 22M записей.
SELECT n.k AS code, count(n.k) AS total
FROM data_prf p
INNER JOIN data_prf_norm n ON (p.data_prf_id = n.data_prf_id)
WHERE (n.questionid = 5) AND (n.v = 1)
GROUP BY n.k
Обс. Таблица data_prf_norm имеет 20M записей с v = 0 и 2M записей v = 1.
Это занимает около 3-5 секунд.
HashAggregate (cost=378204.02..378204.08 rows=6 width=2)
-> Hash Join (cost=100608.78..364361.49 rows=2768506 width=2)
Hash Cond: (n.data_prf_id = p.data_prf_id)
-> Bitmap Heap Scan on data_prf_norm n (cost=51824.36..230655.68 rows=2768506 width=6)
Recheck Cond: (questionid = 5)
-> Bitmap Index Scan on data_prf_norm_questionid_v_idx (cost=0.00..51132.23 rows=2768506 width=0)
Index Cond: (questionid = 5)
-> Hash (cost=44584.42..44584.42 rows=256000 width=4)
-> Index Only Scan using data_prf_pkey on data_prf p (cost=0.42..44584.42 rows=256000 width=4)"
Есть ли способ сделать это быстро?
1) Есть только логическая целостность, поэтому в data_prf_norm нет нечетных записей
2) data_prf.data_prf_id да - это уникальный и первичный ключ.
3) да data_prf_norm.k НЕ НУЛЬ
4) Я создал все индексы
CREATE INDEX data_prf_norm_data_prf_id_idx ON data_prf_norm USING btree (data_prf_id) CREATE INDEX data_prf_norm_k_idx ON data_prf_norm USING btree (k); CREATE INDEX data_prf_norm_questionid_idx ON data_prf_norm USING btree (questionid); CREATE INDEX data_prf_norm_v_idx ON data_prf_norm USING btree (v);
Это индексы, которые я использовал. Есть ли еще какой-нибудь недостающий индекс, чтобы ускорить работу? Я полагаю, 22M не такой уж большой, или я должен считать, что это большой стол?
Спасибо.
data_prf p
таблица избыточна в этом запросе? Из запроса и плана это выглядит так (но мы ничего не знаем о ваших данных) - person zerkms   schedule 03.11.2014n.v = 1
?) - person Erwin Brandstetter   schedule 03.11.2014