DB2資料匯入的四大注意事項

2021-12-30 05:52:41 字數 3006 閱讀 7108

在將資料庫投入生產使用之前,資料庫管理員往往需要先往資料庫中匯入大量的資料。資料庫中只有大量的基礎資料,建立在資料庫上的應用軟體才能夠發揮效益。

本文主要談的就是在將資料從外部檔案匯入導資料庫過程中的一些注意事項。也許這些內容能夠幫助管理員解決難題。

一、預設值與空值的爭奪戰。

在資料庫表設計的時候,為了資料的完整性,往往會對某些列設定一些預設值。特別是某個欄位不允許為空時,要設定預設值。當使用者沒有輸入對應的值的時候,就利用預設值來填充。如有一張銷售訂單的表。這個表上有乙個欄位是「訂單日期」。當使用者沒有輸入資料的時候,這個訂單日期就預設為當前系統的日期,從而達到簡化使用者輸入的目的。現在的問題是,在起初資料匯入的時候,如果目標檔案中沒有這個列對應的值,而這個字段設定了預設值,此時會有什麼後果呢? (db2資料庫與sqlserver資料庫的異同)

通常情況下,只要字段沒有非空的約束條件(即允許存在空值),則無論這個字段有沒有設定預設值,在匯入的時候,只要目標檔案沒有對應的內容,都一律都會使用null值來替代目標檔案中缺失的列。如果這個欄位有非空的約束(即不允許存在空值),則資料庫系統會提示不允許空值的錯誤資訊。也就是說,表中的字段預設值的設定一般情況下在匯入的過程中是無效的。當目標檔案中不存在某個值的時候,資料庫不會以列的預設值來填充,而是一律使用null值來填充。

但是,如果資料庫管理員一定要讓預設值來填充這些這些列,是否可以呢?在db2資料庫中,這是可以的。只要目的表已經定義了預設值,那麼就可以在匯入的語句中使用usedefauits選項,就可以讓資料庫系統(oracle資料庫系統使用經驗六則)在匯入的過車觀念中利用預設值來填充目標檔案中不存在的資料。注意這裡只有目標檔案中對應記錄的字段值不存在的時候,才會使用預設值。如果存在的話,則仍然採用目標檔案中的值。可見這個null值與列預設值之間的戰爭,最後的結果還是在使用者手中。使用者可以通過usedefault選項來確定到底是否需要預設值。如果某個字段設定為了非空,而且這個列又設定了預設值的話,那麼筆者建議採用預設值,這可以在很大程度上簡化資料匯入的工作。

二、匯入過程中的效能考慮。

當將大量的資料插入到資料庫表中的時候,會消耗比較多的資料庫資源,從而影響到資料庫的效能。為此在將資料匯入導資料庫的時候,除了需要選擇乙個使用者訪問量少的時間。還需要在匯入的時候採用合適的手段來提高資料匯入的效能。如在db2資料庫中,資料匯入的工具主要分類兩類,分別為裝入使用工具和匯入工具。當匯入的資料量比較多,而且使用者對於效能又有比較嚴格要求的話,那麼筆者建立採用裝入使用工具。因為通常情況下,在匯入大量資料的時候,裝入使用工具能夠提供比較高的效能。

當在客戶端上匯入資料,而不是直接在伺服器上匯入資料的時候,加入乙個compound子句也可以改善資料庫的效能。這個子句主要是用來對需要插入的資料進行分組,即以多少條記錄為單位,向伺服器傳送插入請求。由於資料需要在客戶端與伺服器之間進行傳遞。客戶端從外部檔案中讀取資料傳遞到資料庫伺服器上需要有一段時間;而資料庫伺服器在接受到客戶端的請求將資料插入到表中也需要一段時間。此時如果採用n語句對需要插入的大量記錄進行分組,可以改善資料庫的效能。一方面可以讓客戶端與伺服器端分工合作,客戶端一邊從外部檔案中讀入資料,伺服器端一邊插入資料,從而減少插入的時間。另一方面,資料分步在網路在網路中傳輸,也可以提高網路傳輸的效能,同樣可以起到提高效能的目的。總之,資料匯入作業往往會降低資料庫正常執行的效能。為此在資料匯入的時候,最好選擇乙個比較合適的時間。並且採用以上建議的一些措施來最大程度的降低匯入工作對資料庫的正常執行帶來的負面影響。

三、讓活動日誌分次落實。

在資料匯入的過程中,其最終還是需要通過insert語句來實現。而db2資料庫在使用這個語句的時候,資料庫引擎將會代表匯入操作對標更新進行常規的記錄。這就好像是在oracle資料庫中將這個表更新的操作記入到日誌檔案一樣。所以,當匯入的記錄比較多就會潛在的長時間占有當前的活動日誌,最終導致資料庫管理器消耗完日誌空間。為此,在匯入資料的過程中,如果記錄的資料比較大,那麼最好使用commitcount n子句。這個子句的主要作用就是告訴資料庫系統,插入n條記錄之後就需要執行一次日誌落實。當使用了這個子句的時候,如果匯入操作失敗,那麼在事務回滾期間,所有最後一次落實以後執行的的改變都會取消。這還可以減少資料匯入失敗而造成的損失。如果沒有採用這個子句,如果匯入失敗的話,資料庫系統會撤消所有匯入的記錄。也就是說,一切都要重頭來過。但是如果採用了這個語句,那麼資料庫管理員就可以根據系統提供的最後乙個落實點的資訊,重新啟用import命令,並通過提供restartcount n子句來指導這個命令跳過在前面已經被報告為成功落實到輸入檔案的行數。即避免重複匯入,來提高資料匯入效率。資料庫管理員可以根據記錄量的多少來合理的設定這個n值。一般情況下這個值不要設定的太大。不過如果太小的話,也會影響到資料匯入的效能。如果資料量很大,筆者往往將這個值設定為500。不過具體情況具體對待,資料庫管理員還是需要根據經驗來判斷選擇乙個合適的值。

四、在匯入語句中採用格式化選項

在匯入資料的時候,一般要求外部檔案都能夠遵守嚴格的格式。如果格式不準確的話,那麼往往資料匯入會失敗。所以,有時候資料庫管理員在匯入的過程中,還不得不採用一些檔案型別修飾符,又叫做格式化選項,來規範外部檔案的格式。讓資料庫系統能夠正確識別外部檔案,從而順利匯入外部資料。

如預設情況下,外部檔案的列與列之間是用英文狀態下的逗號分割的。如果外部檔案不是利用這個符號來分隔的,而是採用冒號或者tab符號來符合來分隔的,此時資料庫管理員有兩個選擇。一是更改原檔案中的分隔符號。利用作業系統的相關命令或者其他軟體的幫助,可以改變這個分隔符號。如通過excle軟體來變更等等。二是在匯入的時候,採用格式化選項,讓匯入工具能夠識別這個分隔符。如可以在匯入語句中加入coldel :子句,告訴資料庫系統,現在採用的列分隔符不是逗號,而是冒號。如此在不更改原檔案的情況下,也可以順利匯入資料。

除此之外,有時候在外部檔案中有可能還會因為疏忽將某條記錄寫成了兩行。由於預設情況下是根據行來判斷記錄,而不是根據列分隔符來區分不同的記錄,所以此時這條記錄會被當作兩條記錄來對待。為了避免這種情況,有時候資料庫管理員需要更改分隔符號的優先極。預設情況下,db2資料庫分隔符的優先極分別為記錄分隔符、字串分隔符、列分隔符。也就是說記錄分隔符(往往是換行符號)具有最高的優先級別。從而就會發生上面提到的情況。為了避免將一條記錄 (在兩行或者多行中顯示)被當作多條記錄對待,最好的方法就是利用 modified by delprioritychar子句來更改分隔符號的優先性。讓列分隔符號具有比較高的優先順序。

使用DB2資料庫臨時表的注意事項

在使用db2的臨時表時,以下幾點需要注意 1.db2的臨時表需要用命令declare temporary table來建立,並且需要建立在使用者臨時表空間上 2.db2在資料庫建立時,預設並不建立使用者臨時表空間,如果需要使用臨時表,則需要使用者在建立臨時表之前建立使用者臨時表空間 3.臨時表的模式...

郵件傳送求職簡歷四大注意事項

1 千萬不要把簡歷只作為附件發出去 首先要提醒求職者的,就是千萬不要把簡歷只放在附件裡發出去,因為這在很多時候,都相當於自己給自己的求職成功率上打了乙個折扣。乙個職位的招聘資訊發出去後,會有大量的應聘郵件塞進郵箱,這對於hr來說簡直是對耐心的巨大考驗。當他好不容易熬到開啟你的郵件,居然發現還要再開啟...

db2 資料庫的匯出匯入

1記錄源資料庫的相關配置引數,包括資料庫登錄檔變數 db2set 資料庫管理系統引數 dbm cfg 資料庫配置引數 db cfg 2用db2look匯出建庫ddl指令碼,用於在目標庫中建立資料庫物件 3用db2move匯出源資料庫的資料 4使用匯出的建庫ddl 由於平台不同可能需要作少量修改 建庫...