Само за три колони този уникален индекс, използващ само основни изрази, трябва да работи много добре. Не са необходими допълнителни модули като 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
Числата са байтове за индексния ред в примера във цигулката, измерени с pg_column_size()
. Моят пример използва само единични знаци, разликата в размера е постоянна.
person
Erwin Brandstetter
schedule
21.08.2013