SELECT *
FROM Table_Name
WHERE (LAST_MODIFIED_DATE >= TO_DATE('${FROM_EXTRACT_VALUE}','YYYY-MM-DD HH24:MI:SS') AND LAST_MODIFIED_DATE < TO_DATE('${TO_EXTRACT_VALUE}','YYYY-MM-DD HH24:MI:SS')) OR (CREATION_DATE >= TO_DATE('${FROM_EXTRACT_VALUE}','YYYY-MM-DD HH24:MI:SS') AND CREATION_DATE < TO_DATE('${TO_EXTRACT_VALUE}','YYYY-MM-DD HH24:MI:SS'))
从Oracle数据库抽数到hadoop,where语句一般会写成or的方式(便于理解),但是OR的方式只能用到 last_modified_date 或者 creatiion_date 的单个索引,不能用到组合索引。如果想用到组合索引就要写成and not的方式。因为OR是跑两个query,如果数据量非常大,全表扫描是特别慢的。解决办法如下:
1)由于表中creatiion_date是没有索引的,即使last_modified_date有索引,整体的抽数时间也是非常久,会导致snapshot too old的问题。所以如果选择OR的方式就要再给creatiion_date建个索引。
2)and not是能用到combine index的,目前可以用到last_modified_date的索引(要加上hint),再加上lob的参数(内部参数),就算不建索引也是可以满足要求的(15分钟,之前2个小时)。
SELECT * FROM Table_Name WHERE last_modified_date >= TO_DATE('2024-04-13 00:00:00', 'YYYY-MM-DD HH24:MI:SS') and creation_date < TO_DATE('2024-04-13 02:00:00', 'YYYY-MM-DD HH24:MI:SS') and not (creation_date < TO_DATE('2024-04-13 00:00:00', 'YYYY-MM-DD HH24:MI:SS') and last_modified_date >= TO_DATE('2024-04-13 02:00:00', 'YYYY-MM-DD HH24:MI:SS'));