簡體   English   中英

用動態參數檢查約束

[英]Check constraint with dynamic parameters

我正在用PostgreSQL創建分區表。

CREATE TABLE tt_parent
(
    id integer,
    log_time timestamp with time zone,
    server_id integer,
    name text,
    CONSTRAINT tt_parent_pkey PRIMARY KEY (id)
)

CREATE TABLE tt_1_2015_week42 (
 CHECK ( server_id = 1 AND log_time >= (to_timestamp('2015-42', 'IYYY-IW')) AND log_time <= (to_timestamp('2015-42', 'IYYY-IW') + '6 days'::interval)
) INHERITS (tt_parent);

CREATE TABLE tt_1_2015_week43 (
 CHECK ( server_id = 1 AND log_time >= (to_timestamp('2015-43', 'IYYY-IW')) AND log_time <= (to_timestamp('2015-43', 'IYYY-IW') + '6 days'::interval)
) INHERITS (tt_parent);

CREATE TABLE tt_1_2015_week44 (
 CHECK ( server_id = 1 AND log_time >= (to_timestamp('2015-44', 'IYYY-IW')) AND log_time <= (to_timestamp('2015-44', 'IYYY-IW') + '6 days'::interval)
) INHERITS (tt_parent);

創建完上面的子表后,當我在下面的查詢中觸發時,它將掃描所有子表。

EXPLAIN SELECT * FROM tt_parent 
WHERE server_id = 1 
AND (log_time >= '2015-10-12 00:00:00'::TIMESTAMP WITH TIME ZONE) 
AND (log_time <= '2015-10-15 00:00:00'::TIMESTAMP WITH TIME ZONE);

從上面的查詢中,where子句中的log_time位於第42周。因此,該查詢應僅掃描“ tt_1_2015_week42”子表。 為什么上面的查詢會掃描所有3個子表?

用動態值檢查約束不起作用? 我們不能在Check約束中使用“ to_timestamp”功能嗎? 如何修改上面的子表檢查約束,以便查詢只能掃描第42周的表。

1)您的檢查條件缺少兩個相鄰分區之間的時間段。 例如,差距:

from: to_timestamp('2015-42', 'IYYY-IW') + '6 days'::interval --2015-10-18 00:00:00
to:   to_timestamp('2015-43', 'IYYY-IW'))                     --2015-10-19 00:00:00

我會寫:

CHECK (
    server_id = 1 AND
    log_time >= '2015-10-12'::timestamptz AND
    log_time < '2015-10-12'::timestamptz + interval '1 week' --'<' sign, not '<=' to avoid overlapping
)

2)要獲得所需的內容,您需要一個選項constraint_exclusion設置為partition (這應該是默認值)。

暫無
暫無

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

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