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'));
浙公網安備 33010602011771號