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