Только для трех столбцов этот уникальный индекс, использующий только базовые выражения, должен работать очень хорошо. Никаких дополнительных модулей, таких как hstore или пользовательские функции, не требуется:
CREATE UNIQUE INDEX t_abc_uni_idx ON t (
LEAST(a,b,c)
, GREATEST(LEAST(a,b), LEAST(b,c), LEAST(a,c))
, GREATEST(a,b,c)
);
скрипт SQL
Также требуется минимум места на диске:
SELECT pg_column_size(row(hstore(t))) AS hst_row
,pg_column_size(row(hstore(ARRAY[a,b,c], ARRAY[a,b,c]))) AS hst1
,pg_column_size(row(hstore(ARRAY[a,b,c], ARRAY[null,null,null]))) AS hst2
,pg_column_size(row(ARRAY[a,b,c])) AS arr
,pg_column_size(row(LEAST(a,b,c)
, GREATEST(LEAST(a,b), LEAST(b,c), LEAST(a,c))
, GREATEST(a,b,c))) AS columns
FROM t;
hst_row | hst1 | hst2 | arr | columns
---------+------+------+-----+---------
59 | 59 | 56 | 69 | 30
Числа — это байты для строки индекса в примере в скрипке, измеренные с помощью а>. В моем примере используются только одиночные символы, разница в размере постоянна.
person
Erwin Brandstetter
schedule
21.08.2013