在非唯一列上创建唯一索引

时间:2015-03-20 16:40:00

标签: sql postgresql postgresql-9.3 unique-index

不确定PostgreSQL 9.3+中是否可以这样做,但我想在非唯一列上创建一个唯一索引。对于像这样的表:

CREATE TABLE data (
  id SERIAL
  , day DATE
  , val NUMERIC
);
CREATE INDEX data_day_val_idx ON data (day, val); 

我希望能够[快速]仅查询不同的日子。我知道我可以使用data_day_val_idx来帮助执行不同的搜索,但是如果不同值的数量远远少于索引覆盖中的行数,这似乎会增加额外的开销。就我而言,30天内大约有1天是截然不同的。

创建关系表是否只能跟踪唯一条目?思维:

CREATE TABLE days (
  day DATE PRIMARY KEY
);

每次插入数据时都会用触发器更新它。

1 个答案:

答案 0 :(得分:3)

索引只能索引实际行,而不是聚合行。所以,是的,就所需的索引而言,创建一个具有您提到的唯一值的表是您唯一的选择。使用从data.daydays.day的外键约束强制引用完整性。根据完整情况,此可能也是性能最佳的。

但是,由于这似乎与性能有关,因此还有另一种解决方案:您可以使用递归CTE来模拟松散的索引扫描:

WITH RECURSIVE cte AS (
   (SELECT day FROM data ORDER BY 1 LIMIT 1)
   UNION ALL
   SELECT (SELECT day FROM data WHERE day > c.day ORDER BY 1 LIMIT 1)
   FROM   cte  c
   )
SELECT day FROM cte;

这只需要day上的普通索引。

根据您的实际查询,有各种变体。详细说明: