0
我有一個表使用多個表中的繼承分區數天。如何避免主表中的掃描
有一個INSERT觸發器將數據插入到適當的表,所以理論上AVL表不應該有任何的數據
CREATE OR REPLACE FUNCTION avl_db.avl_insert_trigger()
RETURNS trigger AS
$BODY$
BEGIN
IF (NEW.event_time >= '2017-06-01 00:00:00' AND NEW.event_time < '2017-06-02 00:00:00') THEN
INSERT INTO avl_db.avl_20170601 VALUES (NEW.*);
ELSEIF (NEW.event_time >= '2017-06-02 00:00:00' AND NEW.event_time < '2017-06-03 00:00:00') THEN
INSERT INTO avl_db.avl_20170602 VALUES (NEW.*);
ELSEIF (NEW.event_time >= '2017-06-03 00:00:00' AND NEW.event_time < '2017-06-04 00:00:00') THEN
INSERT INTO avl_db.avl_20170603 VALUES (NEW.*);
ELSEIF (NEW.event_time >= '2017-06-04 00:00:00' AND NEW.event_time < '2017-06-05 00:00:00') THEN
INSERT INTO avl_db.avl_20170604 VALUES (NEW.*);
ELSEIF (NEW.event_time >= '2017-06-05 00:00:00' AND NEW.event_time < '2017-06-06 00:00:00') THEN
INSERT INTO avl_db.avl_20170605 VALUES (NEW.*);
....
ELSE
RAISE EXCEPTION 'Date out of range.';
END IF;
RETURN NULL;
每個表都有一個檢查約束,因此只有指數檢查表與正確的日期
CONSTRAINT avl_20170605_event_time_check
CHECK (event_time >= '2017-06-05 00:00:00'::timestamp without time zone
AND event_time < '2017-06-06 00:00:00'::timestamp without time zone)
CREATE INDEX avl_20170605__event_time_idx
ON avl_db.avl_20170605
USING btree
(event_time);
的事情是什麼時候使用event_time
過濾仍然d選擇o對主表avl
進行一些操作。
explain analyze
SELECT *
FROM avl_db.avl
WHERE event_time between '2017-06-05 09:40:44'::timestamp without time zone - '6 minute'::interval
AND '2017-06-05 09:40:44'::timestamp without time zone - '1 minute'::interval
你可以看到從avl_20170605__event_time_idx
使用索引,而忽略了表的其餘部分,也嘗試着做一個序列掃描上avl
。
Append (cost=0.00..720.98 rows=7724 width=16) (actual time=0.044..5.523 rows=7851 loops=1)
-> Seq Scan on avl (cost=0.00..0.00 rows=1 width=16) (actual time=0.001..0.001 rows=0 loops=1)
Filter: ((event_time >= '2017-06-05 09:34:44'::timestamp without time zone) AND (event_time <= '2017-06-05 09:39:44'::timestamp without time zone))
-> Index Scan using avl_20170605__event_time_idx on avl_20170605 (cost=0.42..720.98 rows=7723 width=16) (actual time=0.042..5.110 rows=7851 loops=1)
Index Cond: ((event_time >= '2017-06-05 09:34:44'::timestamp without time zone) AND (event_time <= '2017-06-05 09:39:44'::timestamp without time zone))
Planning time: 3.050 ms
Execution time: 5.737 ms
我不知道是否有一種方法優化停止嘗試掃描並追加表avl
。
對於只有一行,執行「Seq掃描」是唯一有效的方法。 –
另外,向我們展示您的創建觸發器 - 是之前還是之後? –
@a_horse_with_no_name我看到'row = 1'。但是這沒有任何意義,那裏不應該有任何行。有什麼方法可以看到哪一排?而我的問題更像是當我添加'CHECK'約束時,優化器只檢查一個表。所以也許我可以設置這麼忽略主表。 –