簡體   English   中英

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

[英]Create a unique index on a non-unique column

不確定這在 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
);

每次我們插入數據時,用觸發器更新它。

索引只能索引實際行,不能索引聚合行。 因此,是的,就所需的索引而言,創建具有您提到的唯一值的表是您唯一的選擇。 使用從data.daydays.day的外鍵約束強制執行參照完整性。 這也可能是最好的性能,這取決於整個情況。

但是,由於這與性能有關,因此有一個替代解決方案:您可以使用遞歸 CTE 來模擬松散索引掃描:

WITH RECURSIVE cte AS (
   (  -- parentheses required
   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
   WHERE  c.day IS NOT NULL  -- exit condition
   )
SELECT day FROM cte;

由於附加的ORDER BYLIMIT子句,第一個SELECT周圍的括號是必需的。 看:

這只需要一個普通的day索引。

根據您的實際查詢,有多種變體:

更多在我對你的后續問題的回答中:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM