根據時間欄位匯入資料的問題總結
在之前的博文中介紹過如何透過exchange partition,split partition達到快速的資料切換,對於上百G的大表來說,速度都在秒級完成
對於大分割槽重新分割槽來說,上面的步驟已經夠用了,但是對於資料清理來說,工作才剛剛開始,這是一種邏輯的資料清理,因為目前分割槽表中重新分割槽後沒有資料,對於歷史資料可以選擇按照分割槽邏輯使用insert append的方式進行資料匯入。
因為分割槽規則是按照時間欄位,所以在資料匯入的時候犯了一個錯誤,就是簡單使用下面的形式來匯入資料。
Insert /*+append*/ into TEST_LOG select * from LOG_CLNUP where time =to_date('20150721','YYYYMMDD');
簡單以為這種情況會吧2015年7月21日的資料匯入,但是從測試情況來說,資料量是在少得厲害,才發現其實這種情況下,預設是會使用0時0分0秒的情況。
我們把隨便一個日期進行按日期格式化,然後使用精細化的格式輸出。
SQL> select to_char(to_date('2014-10-05','yyyy-mm-dd'),'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(TO_DATE('20
-------------------
2014-10-05 00:00:00
當然了,這個錯誤是一個低階錯誤,我們來看我們要做的正事。
分割槽規則是按照月份,即每個月都有一個對應的分割槽,則我們計劃使用下面的格式來插入資料。
Insert /*+append*/ into TEST_LOG select * from LOG_CLNUP where time between to_date('20150721','YYYYMMDD')and to_date('20150722','YYYYMMDD') ;
按照這樣的邏輯應該是沒有問題的。不過還是有一定的隱患,後面會單獨說。
按照表的資料量,每天的增量資料都在百萬,千萬,所以按照天來匯入還是比較合理的,如果按照月,可能時間會很長,而且不好控制。所以按照天來進行資料匯入就需要使用動態sql。
第一個思路就是使用Pl/sql來做。比如對於表TEST_LOG我們這麼做,其實還有好幾個類似的表。方法雷同。
end loop;
end;
/
這種情況下會生成相應的語句來動態插入。
比如
我們就根據sysdate-i的方式來得到相應的日期。這種方式相對來說也能接受,不過比如你在晚上10點執行指令碼,結果過了凌晨,這個時候sysdate就會發生變化,有些日子的資料很可能就會匯入兩次。所以說這種方式也是不夠合理的。就算在當天完成,你去檢視sysdate-i的時候也不是很方便,至少我透過這個不能很快知道我要插入資料的日期。還得推算,有的月31天,有的月30天。。。
所以相對還是這種方式要好一些。
Insert /*+append*/ into TEST_LOG partition(P_2015_07) select * from LOG_CLNUP where time between to_date('20150701','YYYYMMDD') and to_date('20150702','YYYYMMDD');
如果希望使用動態sql來完成,可以這麼做。
在絕大多數的場景裡這種資料匯入方式是沒有問題的,但是有一種場景會報下面的錯誤。比如
這個問題還是在時間戳上出了問題,因為時間戳跨分割槽了。所以在檢查的時候會有一些問題。
可以這麼改。
Insert /*+append*/ into M_START_LOG partition(P_2015_06) select * from M_START_LOG_CLNUP where time between to_date('20150630 00:00:00','YYYYMMDD hh24:mi:ss') and to_date('20150630 23:59:59','YYYYMMDD hh24:mi:ss');
這種方式就可以了。如果希望該成這種方式也可以,指令碼變化不大,我就不列舉了。
所以透過這個透過時間戳匯入資料的案例來看,還是有不少的坑的,還是需要不斷驗證,大膽猜想,小心求證。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-1746738/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL 如何在時間序列中根據欄位變化分組SQL
- 根據欄位查表名
- DBeaver 資料匯入SQL時的問題SQL
- Java根據前端返回的欄位名進行查詢資料Java前端
- SpringJpa @query 中根據傳入引數(欄位)排序Spring排序
- Java根據前端返回的欄位名進行查詢資料的方法Java前端
- 匯入excel 資料時間Excel
- list集合根據某欄位分組
- 總結Oracle根據時間查詢的一些常見情況Oracle
- List根據時間排序排序
- js根據時間排序JS排序
- 如何插入關聯表資料,或插入資料的時候執行,根據某欄位執行一個函式函式
- 【oracle 資料匯入匯出字元問題】Oracle字元
- jQuery根據表格欄位升序和降序詳解jQuery
- 二維陣列根據欄位進行排序陣列排序
- 二維陣列根據某個欄位排序陣列排序
- expdpnf 匯出問題總結
- SqlServer根據特定欄位分組後,對需要欄位進行分組拼接SQLServer
- 倒數計時快取時間問題總結快取
- Linux shell 根據時間批量刪除指定資料夾下的檔案Linux
- 根據介面返回的二進位制流匯出檔案
- sql根據多個欄位查詢重複記錄SQL
- POI實現大資料EXCLE匯入匯出,解決記憶體溢位問題大資料記憶體溢位
- JS 根據彙總結果過濾JS
- [BUG反饋]關於ot模型中的時間型別欄位bug問題模型型別
- 32 位 PHP 時間戳問題PHP時間戳
- swift4.0 物件資料來源根據屬性分組,時間排序Swift物件排序
- 【曹工雜談】Mysql-Connector-Java時區問題的一點理解--寫入資料庫的時間總是晚13小時問題MySqlJava資料庫
- Oracle資料庫連結(DBLink)中如何訪問包含BLOB欄位的資料Oracle資料庫
- MySQL 資料庫技巧:批次更新隨機生成的時間戳欄位MySql資料庫隨機時間戳
- python-進階教程-根據欄位將記錄分組Python
- js物件陣列(JSON) 根據某個共同欄位 分組物件陣列JSON
- jackson根據屬性名動態序列化物件欄位物件
- python 根據時間戳建立目錄操作Python時間戳
- vue+element-ui根據時間查詢VueUI
- php 根據給定字串時間獲取時區PHP字串
- 基於Geomesa服務查詢軌跡資料無法根據空間和時間範圍進行查詢的問題解決辦法
- Redis資料匯入工具優化過程總結Redis優化
- ODI基於源表時間戳欄位獲取增量資料時間戳