本文將為您介紹DB2數據庫系統中,外部文件導入導數據庫過程中的一些需要注意的問題,供您參考,希望對您有所幫助。
在將數據庫投入生產使用之前,數據庫管理員往往需要先往數據庫中導入大量的數據。數據庫中只有大量的基礎數據,建立在數據庫上的應用軟件才能夠發揮效益。
本文主要談的就是在將數據從外部文件導入導數據庫過程中的一些注意事項。也許這些內容能夠幫助管理員解決難題。
一、默認值與空值的爭奪戰。
在數據庫表設計的時候,為了數據的完整性,往往會對某些列設置一些默認值。特別是某個字段不允許為空時,要設置默認值。當用戶沒有輸入對應的值的時候,就利用默認值來填充。如有一張銷售訂單的表。這個表上有一個字段是“訂單日期”。當用戶沒有輸入數據的時候,這個訂單日期就默認為當前系統的日期,從而達到簡化用戶輸入的目的。現在的問題是,在起初數據導入的時候,如果目標文件中沒有這個列對應的值,而這個字段設置了默認值,此時會有什麼後果呢? (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子句來更改分隔符號的優先性。讓列分隔符號具有比較高的優先級。