[英]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.day
到days.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 BY
和LIMIT
子句,第一個SELECT
周圍的括號是必需的。 看:
這只需要一個普通的day
索引。
根據您的實際查詢,有多種變體:
更多在我對你的后續問題的回答中:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.