Сравните эти две таблицы 10M записей:
create table test (a int8 not null, b int8 not null, primary key(a,b));
insert into test
select generate_series(1,10000000), generate_series(1,10000000);
select pg_size_pretty(pg_total_relation_size('test'));
<b>723 MB</b>
create table test_bytea (a bytea not null);
insert into test_bytea
select decode(lpad(to_hex(a),16,'0')||lpad(to_hex(b),16,'0'),'hex') from test;
alter table test_bytea add primary key (a);
select pg_size_pretty(pg_total_relation_size('test_bytea'));
<b>804 MB</b>
A bytea
с индексом на 11% больше, чем 2*int8
. Это немного, но это означает, что в кэше будет на 11% меньше строк. И последовательное сканирование будет на 11% медленнее и т. Д.
Если ваши данные не меняются, возможно, вам следует рассмотреть вопрос о хранении отсортированных значений в плоском файле вместо базы данных - это будет всего 152 МБ на 10 М записей, а поиск будет O (log (n)).