DB2數(shù)據(jù)庫外部文件導入的注意事項
本文將為您介紹DB2數(shù)據(jù)庫系統(tǒng)中,外部文件導入導數(shù)據(jù)庫過程中的一些需要注意的問題,供您參考,希望對您有所幫助。
在將數(shù)據(jù)庫投入生產(chǎn)使用之前,數(shù)據(jù)庫管理員往往需要先往數(shù)據(jù)庫中導入大量的數(shù)據(jù)。數(shù)據(jù)庫中只有大量的基礎(chǔ)數(shù)據(jù),建立在數(shù)據(jù)庫上的應(yīng)用軟件才能夠發(fā)揮效益。
本文主要談的就是在將數(shù)據(jù)從外部文件導入導數(shù)據(jù)庫過程中的一些注意事項。也許這些內(nèi)容能夠幫助管理員解決難題。
一、默認值與空值的爭奪戰(zhàn)。
在數(shù)據(jù)庫表設(shè)計的時候,為了數(shù)據(jù)的完整性,往往會對某些列設(shè)置一些默認值。特別是某個字段不允許為空時,要設(shè)置默認值。當用戶沒有輸入對應(yīng)的值的時候,就利用默認值來填充。如有一張銷售訂單的表。這個表上有一個字段是“訂單日期”。當用戶沒有輸入數(shù)據(jù)的時候,這個訂單日期就默認為當前系統(tǒng)的日期,從而達到簡化用戶輸入的目的?,F(xiàn)在的問題是,在起初數(shù)據(jù)導入的時候,如果目標文件中沒有這個列對應(yīng)的值,而這個字段設(shè)置了默認值,此時會有什么后果呢? (DB2數(shù)據(jù)庫與SQLServer數(shù)據(jù)庫的異同)
通常情況下,只要字段沒有非空的約束條件(即允許存在空值),則無論這個字段有沒有設(shè)置默認值,在導入的時候,只要目標文件沒有對應(yīng)的內(nèi)容,都一律都會使用NULL值來替代目標文件中缺失的列。如果這個字段有非空的約束(即不允許存在空值),則數(shù)據(jù)庫系統(tǒng)會提示不允許空值的錯誤信息。也就是說,表中的字段默認值的設(shè)置一般情況下在導入的過程中是無效的。當目標文件中不存在某個值的時候,數(shù)據(jù)庫不會以列的默認值來填充,而是一律使用NULL值來填充。
但是,如果數(shù)據(jù)庫管理員一定要讓默認值來填充這些這些列,是否可以呢?在DB2數(shù)據(jù)庫中,這是可以的。只要目的表已經(jīng)定義了默認值,那么就可以在導入的語句中使用USEDEFAUITS選項,就可以讓數(shù)據(jù)庫系統(tǒng)(Oracle數(shù)據(jù)庫系統(tǒng)使用經(jīng)驗六則)在導入的過車觀念中利用默認值來填充目標文件中不存在的數(shù)據(jù)。注意這里只有目標文件中對應(yīng)記錄的字段值不存在的時候,才會使用默認值。如果存在的話,則仍然采用目標文件中的值??梢娺@個NULL值與列默認值之間的戰(zhàn)爭,最后的結(jié)果還是在用戶手中。用戶可以通過USEDEFAULT選項來確定到底是否需要默認值。如果某個字段設(shè)置為了非空,而且這個列又設(shè)置了默認值的話,那么筆者建議采用默認值,這可以在很大程度上簡化數(shù)據(jù)導入的工作。#p#
二、導入過程中的性能考慮。
當將大量的數(shù)據(jù)插入到數(shù)據(jù)庫表中的時候,會消耗比較多的數(shù)據(jù)庫資源,從而影響到數(shù)據(jù)庫的性能。為此在將數(shù)據(jù)導入導數(shù)據(jù)庫的時候,除了需要選擇一個用戶訪問量少的時間。還需要在導入的時候采用合適的手段來提高數(shù)據(jù)導入的性能。如在DB2數(shù)據(jù)庫中,數(shù)據(jù)導入的工具主要分類兩類,分別為裝入使用工具和導入工具。當導入的數(shù)據(jù)量比較多,而且用戶對于性能又有比較嚴格要求的話,那么筆者建立采用裝入使用工具。因為通常情況下,在導入大量數(shù)據(jù)的時候,裝入使用工具能夠提供比較高的性能。
當在客戶端上導入數(shù)據(jù),而不是直接在服務(wù)器上導入數(shù)據(jù)的時候,加入一個compound子句也可以改善數(shù)據(jù)庫的性能。這個子句主要是用來對需要插入的數(shù)據(jù)進行分組,即以多少條記錄為單位,向服務(wù)器傳送插入請求。由于數(shù)據(jù)需要在客戶端與服務(wù)器之間進行傳遞。客戶端從外部文件中讀取數(shù)據(jù)傳遞到數(shù)據(jù)庫服務(wù)器上需要有一段時間;而數(shù)據(jù)庫服務(wù)器在接受到客戶端的請求將數(shù)據(jù)插入到表中也需要一段時間。此時如果采用n語句對需要插入的大量記錄進行分組,可以改善數(shù)據(jù)庫的性能。一方面可以讓客戶端與服務(wù)器端分工合作,客戶端一邊從外部文件中讀入數(shù)據(jù),服務(wù)器端一邊插入數(shù)據(jù),從而減少插入的時間。另一方面,數(shù)據(jù)分步在網(wǎng)絡(luò)在網(wǎng)絡(luò)中傳輸,也可以提高網(wǎng)絡(luò)傳輸?shù)男阅?,同樣可以起到提高性能的目的??傊?,?shù)據(jù)導入作業(yè)往往會降低數(shù)據(jù)庫正常運行的性能。為此在數(shù)據(jù)導入的時候,最好選擇一個比較合適的時間。并且采用以上建議的一些措施來最大程度的降低導入工作對數(shù)據(jù)庫的正常運行帶來的負面影響。
三、讓活動日志分次落實。
在數(shù)據(jù)導入的過程中,其最終還是需要通過Insert語句來實現(xiàn)。而DB2數(shù)據(jù)庫在使用這個語句的時候,數(shù)據(jù)庫引擎將會代表導入操作對標更新進行常規(guī)的記錄。這就好像是在Oracle數(shù)據(jù)庫中將這個表更新的操作記入到日志文件一樣。所以,當導入的記錄比較多就會潛在的長時間占有當前的活動日志,最終導致數(shù)據(jù)庫管理器消耗完日志空間。為此,在導入數(shù)據(jù)的過程中,如果記錄的數(shù)據(jù)比較大,那么最好使用COMMITCOUNT N子句。這個子句的主要作用就是告訴數(shù)據(jù)庫系統(tǒng),插入N條記錄之后就需要執(zhí)行一次日志落實。當使用了這個子句的時候,如果導入操作失敗,那么在事務(wù)回滾期間,所有最后一次落實以后執(zhí)行的的改變都會取消。這還可以減少數(shù)據(jù)導入失敗而造成的損失。如果沒有采用這個子句,如果導入失敗的話,數(shù)據(jù)庫系統(tǒng)會撤消所有導入的記錄。也就是說,一切都要重頭來過。但是如果采用了這個語句,那么數(shù)據(jù)庫管理員就可以根據(jù)系統(tǒng)提供的最后一個落實點的信息,重新啟用Import命令,并通過提供RESTARTCOUNT N子句來指導這個命令跳過在前面已經(jīng)被報告為成功落實到輸入文件的行數(shù)。即避免重復(fù)導入,來提高數(shù)據(jù)導入效率。數(shù)據(jù)庫管理員可以根據(jù)記錄量的多少來合理的設(shè)置這個n值。一般情況下這個值不要設(shè)置的太大。不過如果太小的話,也會影響到數(shù)據(jù)導入的性能。如果數(shù)據(jù)量很大,筆者往往將這個值設(shè)置為500。不過具體情況具體對待,數(shù)據(jù)庫管理員還是需要根據(jù)經(jīng)驗來判斷選擇一個合適的值。#p#
四、在導入語句中采用格式化選項。
在導入數(shù)據(jù)的時候,一般要求外部文件都能夠遵守嚴格的格式。如果格式不準確的話,那么往往數(shù)據(jù)導入會失敗。所以,有時候數(shù)據(jù)庫管理員在導入的過程中,還不得不采用一些文件類型修飾符,又叫做格式化選項,來規(guī)范外部文件的格式。讓數(shù)據(jù)庫系統(tǒng)能夠正確識別外部文件,從而順利導入外部數(shù)據(jù)。
如默認情況下,外部文件的列與列之間是用英文狀態(tài)下的逗號分割的。如果外部文件不是利用這個符號來分隔的,而是采用冒號或者TAB符號來符合來分隔的,此時數(shù)據(jù)庫管理員有兩個選擇。一是更改原文件中的分隔符號。利用操作系統(tǒng)的相關(guān)命令或者其他軟件的幫助,可以改變這個分隔符號。如通過Excle軟件來變更等等。二是在導入的時候,采用格式化選項,讓導入工具能夠識別這個分隔符。如可以在導入語句中加入COLDEL :子句,告訴數(shù)據(jù)庫系統(tǒng),現(xiàn)在采用的列分隔符不是逗號,而是冒號。如此在不更改原文件的情況下,也可以順利導入數(shù)據(jù)。
除此之外,有時候在外部文件中有可能還會因為疏忽將某條記錄寫成了兩行。由于默認情況下是根據(jù)行來判斷記錄,而不是根據(jù)列分隔符來區(qū)分不同的記錄,所以此時這條記錄會被當作兩條記錄來對待。為了避免這種情況,有時候數(shù)據(jù)庫管理員需要更改分隔符號的優(yōu)先極。默認情況下,DB2數(shù)據(jù)庫分隔符的優(yōu)先極分別為記錄分隔符、字符串分隔符、列分隔符。也就是說記錄分隔符(往往是換行符號)具有最高的優(yōu)先級別。從而就會發(fā)生上面提到的情況。為了避免將一條記錄 (在兩行或者多行中顯示)被當作多條記錄對待,最好的方法就是利用 MODIFIED BY DELPRIORITYCHAR子句來更改分隔符號的優(yōu)先性。讓列分隔符號具有比較高的優(yōu)先級。