Postgresql 日期函数扫描每个分区中的每一行并且执行速度非常慢
Postgresql date function scanning every row in every partition and is very slow performing
我有一个很大的分区 table tbl_VehicleEntry
。
我创建了一个函数 F_GetSysDate()
(为了我的函数与 oracle 的兼容性)
创建 TABLE tbl_vehicleentry (
vehicleentry_code numeric(12,0) NOT NULL,
shift_date timestamp without time zone NOT NULL,
shift_code numeric(1,0) NOT NULL,
booth_code numeric(2,0) NOT NULL,
.
.
N number of columns);
这样的分区...
创建 TABLE tbl_vehicleentry_2016 (
CONSTRAINT tbl_vehicleentry_2016_shift_date_check CHECK (((shift_date >= '2016-01-01'::date) AND (shift_date < '2017-01-01'::date)))
)
继承 (tbl_vehicleentry);
更改 TABLE tbl_vehicleentry_2016 所有者为 tms;
创建 TABLE tbl_vehicleentry_201701 (
CONSTRAINT tbl_vehicleentry_201701_shift_date_check CHECK (((shift_date >= '2017-01-01'::date) AND (shift_date < '2017-02-01'::date)))
)
继承 (tbl_vehicleentry);
更改 TABLE tbl_vehicleentry_201701 所有者为 tms;
创建 TABLE tbl_vehicleentry_201702 (
CONSTRAINT tbl_vehicleentry_201702_shift_date_check CHECK (((shift_date >= '2017-02-01'::date) AND (shift_date < '2017-03-01'::date)))
)
继承 (tbl_vehicleentry);
更改 TABLE tbl_vehicleentry_201702 所有者为 tms;
创建 TABLE tbl_vehicleentry_201703 (
CONSTRAINT tbl_vehicleentry_201703_shift_date_check CHECK (((shift_date >= '2017-03-01'::date) AND (shift_date < '2017-04-01'::date)))
)
继承 (tbl_vehicleentry);
更改 TABLE tbl_vehicleentry_201703 所有者为 tms;
..... 以此类推 2017 年以后的按月分区
-- FUNCTION: public.f_getsysdate()
-- DROP FUNCTION public.f_getsysdate();
CREATE OR REPLACE FUNCTION public.f_getsysdate(
)
RETURNS timestamp without time zone
LANGUAGE 'plpgsql'
COST 100
STABLE SECURITY DEFINER
AS $BODY$
DECLARE
V_ReturnName VARCHAR2 ;
BEGIN
RETURN current_timestamp::timestamp(0);
END
$BODY$;
ALTER FUNCTION public.f_getsysdate()
OWNER TO tms;
现在,当我 运行 查询像...
Explain analyze
SELECT MAX(Vehicleentry_Code) FROM tbl_VehicleEntry
WHERE Shift_Date >= f_getsysdate() - 30
或
Explain analyze
SELECT MAX(Vehicleentry_Code) FROM tbl_VehicleEntry
WHERE Shift_Date >= f_getsysdate() - interval '30' day
我观察到,它正在扫描 table 每个分区的每一行并使其非常慢。
下面是解释
聚合(成本=324.08..324.09 行=1 宽度=32)
-> 追加(成本=0.68..323.88 行=79 宽度=16)
-> Index Scan using isd_tbl_vehicleentry on tbl_vehicleentry (cost=0.68..4.70 rows=1 width=8)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_2015 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_2015 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_2016 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_2016 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201701 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201701 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201702 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201702 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201703 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201703 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201704 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201704 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201705 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201705 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201706 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201706 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201707 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201707 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201708 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201708 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201709 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201709 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201710 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201710 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201711 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201711 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201712 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201712 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201801 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201801 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201802 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201802 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201803 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201803 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201804 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201804 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201805 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201805 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201806 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201806 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201807 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201807 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201808 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201808 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201809 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201809 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201810 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201810 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201811 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201811 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201812 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201812 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
**看到它扫描了我的 postgresql 每个分区的每一行 table
并使其执行非常慢。
有什么问题吗?
肯定是功能上的问题。
有没有其他方法可以让它更快?
请帮忙。**
那是因为在计划查询时函数的值是未知的,所以优化器不知道是否可以排除某些分区。
您应该首先查询 f_getsysdate()
,然后根据结果构造一个 SQL 语句并执行它。这样限制将是一个常量,PostgreSQL 优化器可以使用它。
PostgreSQL 如果函数是 IMMUTABLE
可以做得更好,但根据名称我认为这不是一个选项。
我有一个很大的分区 table tbl_VehicleEntry
。
我创建了一个函数 F_GetSysDate()
(为了我的函数与 oracle 的兼容性)
创建 TABLE tbl_vehicleentry (
vehicleentry_code numeric(12,0) NOT NULL,
shift_date timestamp without time zone NOT NULL,
shift_code numeric(1,0) NOT NULL,
booth_code numeric(2,0) NOT NULL,
.
.
N number of columns);
这样的分区...
创建 TABLE tbl_vehicleentry_2016 (
CONSTRAINT tbl_vehicleentry_2016_shift_date_check CHECK (((shift_date >= '2016-01-01'::date) AND (shift_date < '2017-01-01'::date)))
) 继承 (tbl_vehicleentry);
更改 TABLE tbl_vehicleentry_2016 所有者为 tms;
创建 TABLE tbl_vehicleentry_201701 (
CONSTRAINT tbl_vehicleentry_201701_shift_date_check CHECK (((shift_date >= '2017-01-01'::date) AND (shift_date < '2017-02-01'::date)))
)
继承 (tbl_vehicleentry);
更改 TABLE tbl_vehicleentry_201701 所有者为 tms;
创建 TABLE tbl_vehicleentry_201702 (
CONSTRAINT tbl_vehicleentry_201702_shift_date_check CHECK (((shift_date >= '2017-02-01'::date) AND (shift_date < '2017-03-01'::date)))
)
继承 (tbl_vehicleentry);
更改 TABLE tbl_vehicleentry_201702 所有者为 tms;
创建 TABLE tbl_vehicleentry_201703 (
CONSTRAINT tbl_vehicleentry_201703_shift_date_check CHECK (((shift_date >= '2017-03-01'::date) AND (shift_date < '2017-04-01'::date)))
)
继承 (tbl_vehicleentry);
更改 TABLE tbl_vehicleentry_201703 所有者为 tms;
..... 以此类推 2017 年以后的按月分区
-- FUNCTION: public.f_getsysdate()
-- DROP FUNCTION public.f_getsysdate();
CREATE OR REPLACE FUNCTION public.f_getsysdate(
)
RETURNS timestamp without time zone
LANGUAGE 'plpgsql'
COST 100
STABLE SECURITY DEFINER
AS $BODY$
DECLARE
V_ReturnName VARCHAR2 ;
BEGIN
RETURN current_timestamp::timestamp(0);
END
$BODY$;
ALTER FUNCTION public.f_getsysdate()
OWNER TO tms;
现在,当我 运行 查询像...
Explain analyze
SELECT MAX(Vehicleentry_Code) FROM tbl_VehicleEntry
WHERE Shift_Date >= f_getsysdate() - 30
或
Explain analyze
SELECT MAX(Vehicleentry_Code) FROM tbl_VehicleEntry
WHERE Shift_Date >= f_getsysdate() - interval '30' day
我观察到,它正在扫描 table 每个分区的每一行并使其非常慢。 下面是解释
聚合(成本=324.08..324.09 行=1 宽度=32) -> 追加(成本=0.68..323.88 行=79 宽度=16)
-> Index Scan using isd_tbl_vehicleentry on tbl_vehicleentry (cost=0.68..4.70 rows=1 width=8)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_2015 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_2015 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_2016 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_2016 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201701 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201701 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201702 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201702 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201703 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201703 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201704 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201704 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201705 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201705 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201706 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201706 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201707 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201707 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201708 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201708 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201709 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201709 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201710 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201710 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201711 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201711 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201712 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201712 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201801 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201801 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201802 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201802 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201803 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201803 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201804 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201804 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201805 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201805 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201806 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201806 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201807 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201807 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201808 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201808 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201809 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201809 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201810 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201810 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201811 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201811 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Heap Scan on tbl_vehicleentry_201812 (cost=4.41..12.28 rows=3 width=16)
Recheck Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
-> Bitmap Index Scan on isd_tbl_vehicleentry_201812 (cost=0.00..4.41 rows=3 width=0)
Index Cond: (shift_date >= (f_getsysdate() - '30 days'::interval day))
**看到它扫描了我的 postgresql 每个分区的每一行 table 并使其执行非常慢。 有什么问题吗?
肯定是功能上的问题。
有没有其他方法可以让它更快? 请帮忙。**
那是因为在计划查询时函数的值是未知的,所以优化器不知道是否可以排除某些分区。
您应该首先查询 f_getsysdate()
,然后根据结果构造一个 SQL 语句并执行它。这样限制将是一个常量,PostgreSQL 优化器可以使用它。
PostgreSQL 如果函数是 IMMUTABLE
可以做得更好,但根据名称我认为这不是一个选项。