ORACLE交換分割槽時,最好不使用without validation,容易造成查詢紊亂
阿新 • • 發佈:2019-01-08
某日測試發現以下兩個sql
select * from tableName where risk_date = 20181201; --有資料 select * from tableName where risk_date = '20181201'; --無資料
這兩個SQL一般來說,效率上會有一定差別,但是結果不應有差別
後來發現,20181201這天的資料不在P20181201這個分割槽,而存放在P20181131這個分割槽,而正常情況下這天的資料應該是存放不進去的,因為根據分割槽策略P20181131這個分割槽存放的是大於等於2018年11月31日,小於2018年12月1日的資料。
而2018年12月1日的資料的確錯誤的存放在P20181131分割槽中,出現這種情況的唯一可能性是交換分割槽,且帶上了without validation選項。
那麼為什麼第一個SQL有資料,而第二個SQL沒有資料呢???
在第一個SQL中,20181201沒有單引號,即數字型別,所以一定走的是全表掃描,且在全表掃描的過程中將20181201轉換成與risk_date一樣的型別,即字元型,掃描到P20181131的時候發現數據。
而第二個SQL,由於是字元型,與risk_date型別一致,所以走的是分割槽掃描,掃描的分割槽是P20181201,而這個分割槽的確是沒有資料的,所以整個sql沒有記錄返回。
所以在使用交換分割槽的時候,最好不要加上without validation 選項,否則可能查詢紊亂。