当Oracle日期类型为varchar2时,通过oracle_fdw在PostgreSQL中执行查询时,使用比较运算符>=进行查询,这种情况下不能使用索引。
不能使用索引:
>= to_char(now() - interval '7' day, 'YYYYMMDD')
Output: a.date, a.cusno
Filter: ((a.date)::date >= ((now() - '07 days'::interval day))::date)
Oracle query: SELECT /*a05802d21e2d4cec93da21f1abf9ffbb*/ r1."DATE", r1."CUSNO" FROM "ORACLEDB"."CXXXINFO" r1 WHERE (r1."CUSNO" = '12345')
Oracle plan: SELECT STATEMENT
Oracle plan: TABLE ACCESS FULL CXXXINFO (filter "R1"."CUSNO"='12345')
但是 = 在这种情况下,使用索引。
使用索引:
= to_char(now() - interval '7' day, 'YYYYMMDD')
Output: a.date, a.cusno
Oracle query: SELECT /*b7552642e64dd971ba5293a42d581661*/ r1."DATE", r1."CUSNO"
WHERE (r1."CUSNO" = '12345') AND (r1."DATE" = to_char(((CAST (:now AS
TIMESTAMP WITH TIME ZONE)) - INTERVAL '07 00:00:00.000000' DAY(9) TO
SECOND(6)), 'YYYYMMDD'))
Oracle plan: SELECT STATEMENT
Oracle plan: TABLE ACCESS BY INDEX ROWID CXXXINFO
Oracle plan: INDEX SKIP SCAN CXXXINFO_01 (condition "R1"."CUSNO"='12345' AND "R1"."DATE"=TO_CHAR(CAST(:NOW AS
TIMESTAMP WITH TIME ZONE)-INTERVAL'+000000007 00:00:00.000000' DAY(9)
TO SECOND(6),'YYYYMMDD'))(filter "R1"."DATE"=TO_CHAR(CAST(:NOW AS TIMESTAMP WITH TIME > ZONE)-INTERVAL'+000000007 00:00:00.000000' DAY(9) TO
> SECOND(6),'YYYYMMDD'))
我可以知道有什么区别吗?
我目前使用的是 Oracle 19.0.2 版本
PostgreSQl oracle_fdw 2.2
和 PostgreSQL 12.7