![Oracle20111213--數(shù)據(jù)導(dǎo)入方法比較_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-8/25/bef6d445-a4b9-43c0-a96f-e264804a3b44/bef6d445-a4b9-43c0-a96f-e264804a3b441.gif)
![Oracle20111213--數(shù)據(jù)導(dǎo)入方法比較_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-8/25/bef6d445-a4b9-43c0-a96f-e264804a3b44/bef6d445-a4b9-43c0-a96f-e264804a3b442.gif)
![Oracle20111213--數(shù)據(jù)導(dǎo)入方法比較_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-8/25/bef6d445-a4b9-43c0-a96f-e264804a3b44/bef6d445-a4b9-43c0-a96f-e264804a3b443.gif)
![Oracle20111213--數(shù)據(jù)導(dǎo)入方法比較_第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-8/25/bef6d445-a4b9-43c0-a96f-e264804a3b44/bef6d445-a4b9-43c0-a96f-e264804a3b444.gif)
![Oracle20111213--數(shù)據(jù)導(dǎo)入方法比較_第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-8/25/bef6d445-a4b9-43c0-a96f-e264804a3b44/bef6d445-a4b9-43c0-a96f-e264804a3b445.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Oracle 數(shù)據(jù)導(dǎo)入方法比較每個(gè)數(shù)據(jù)庫管理員都會(huì)面臨數(shù)據(jù)導(dǎo)入的問題,這有可能發(fā)生在數(shù)據(jù)庫的新老移植過程中,或者是在數(shù)據(jù)庫崩潰后的恢復(fù)重建過程中,還有可能是在創(chuàng)建測(cè)試數(shù)據(jù)庫的模擬環(huán)境過程中,總之作為一名合格的數(shù)據(jù)庫管理員,你應(yīng)該做好接受各種數(shù)據(jù)導(dǎo)入請(qǐng)求的技術(shù)儲(chǔ)備,同時(shí)還要盡量滿足人本能的對(duì)導(dǎo)入速度的苛求。本文僅針對(duì) Oracle 數(shù)據(jù)庫所提供的加速數(shù)據(jù)導(dǎo)入的各種特性和技術(shù)進(jìn)行探討,其中的一些方法也可以轉(zhuǎn)化應(yīng)用于其他數(shù)據(jù)庫。以下七種數(shù)據(jù)導(dǎo)入方法哪個(gè)最適用需要針對(duì)具體情況具體分析,我也附帶列舉了影響導(dǎo)入速度的各種因素供斟酌。為了比較各種數(shù)據(jù)導(dǎo)入方法的效果,我創(chuàng)建了示例表和數(shù)據(jù)集,并用各種方法導(dǎo)入示
2、例數(shù)據(jù)集來計(jì)算總體導(dǎo)入時(shí)間和導(dǎo)入進(jìn)程占用 CPU 時(shí)間,這里得出的時(shí)間僅供參考。需要說明的是,建議你使用 Oracle 9i 企業(yè)版數(shù)據(jù)庫,當(dāng)然你也可以嘗試使用 Oracle 7.3 以上的標(biāo)準(zhǔn)版數(shù)據(jù)庫。本文使用的機(jī)器配置為:CPU Intel P4,內(nèi)存 256M,數(shù)據(jù)庫 Oracle 9i 企業(yè)版 示例表結(jié)構(gòu)和數(shù)據(jù)集為了演示和比較各種數(shù)據(jù)導(dǎo)入方法,我假定數(shù)據(jù)導(dǎo)入任務(wù)是將外部文件數(shù)據(jù)導(dǎo)入到 Oracle 數(shù)據(jù)庫的CALLS表中,外部數(shù)據(jù)文件包含十萬條呼叫中心記錄,將近 6MB 的文件大小,具體的數(shù)據(jù)示例如下:82302284384,2003-04-18:13:18:58,5001,投訴,手機(jī)
3、三包維修質(zhì)量82302284385,2003-04-18:13:18:59,3352,咨詢,供水熱線的號(hào)碼82302284386,2003-04-18:13:19:01,3142,建議,增設(shè)公交線路 接受導(dǎo)入數(shù)據(jù)的表名是 CALLS,表結(jié)構(gòu)如下: Name Null? Type Comment - - - - CALL_ID NOT NULL NUMBER Primary key CALL_DATE NOT NULL DATE Non-unique index EMP_ID NOT NULL NUMBER CALL_TYPE NOT NULL VARCHAR2(12) DETAILS VARC
4、HAR2(25)逐條數(shù)據(jù)插入INSERT 數(shù)據(jù)導(dǎo)入的最簡(jiǎn)單方法就是編寫 INSERT 語句,將數(shù)據(jù)逐條插入數(shù)據(jù)庫。這種方法只適合導(dǎo)入少量數(shù)據(jù),如 SQL*Plus 腳本創(chuàng)建某個(gè)表的種子數(shù)據(jù)。該方法的最大缺點(diǎn)就是導(dǎo)入速度緩慢,占用了大量的 CPU 處理時(shí)間,不適合大批量數(shù)據(jù)的導(dǎo)入;而其主要優(yōu)點(diǎn)就是導(dǎo)入構(gòu)思簡(jiǎn)單又有修改完善的彈性,不需要多做其它的準(zhǔn)備就可以使用。如果你有很多時(shí)間沒法打發(fā),又想折磨一下數(shù)據(jù)庫和 CPU,那這種方法正適合你。:) 為了與其它方法做比較,現(xiàn)將十萬條記錄通過此方法導(dǎo)入到 CALLS 表中,總共消耗 172 秒,其中導(dǎo)入進(jìn)程占用 CPU 時(shí)間為 52 秒。逐條數(shù)據(jù)插入 INS
5、ERT,表暫無索引 為什么上一種方法占用了較多的 CPU 處理時(shí)間,關(guān)鍵是 CALLS 表中已創(chuàng)建了索引,當(dāng)一條數(shù)據(jù)插入到表中時(shí),Oracle 需要判別新數(shù)據(jù)與老數(shù)據(jù)在索引方面是否有沖突,同時(shí)要更新表中的所有索引,重復(fù)更新索引會(huì)消耗一定的時(shí)間。因此提高導(dǎo)入速度的好辦法就是在創(chuàng)建表時(shí)先不創(chuàng)建索引或者在導(dǎo)入數(shù)據(jù)之前刪除所有索引,在外部文件數(shù)據(jù)逐條插入到表中后再統(tǒng)一創(chuàng)建表的索引。這樣導(dǎo)入速度會(huì)提高,同時(shí)創(chuàng)建的索引也很緊湊而有效,這一原則同樣適用于位圖索引(Bitmap Index)。對(duì)于主要的和唯一的關(guān)鍵約束(key constraints),可以使之先暫時(shí)失效(disabling)或者刪除約束來獲
6、得同樣的效果,當(dāng)然這些做法會(huì)對(duì)已經(jīng)存在的表的外鍵約束產(chǎn)生相關(guān)的影響,在刪除前需要通盤斟酌。 需要說明的是,這種方法在表中已存在很多數(shù)據(jù)的情況下不太合適。例如表中已有九千萬條數(shù)據(jù),而此時(shí)需要追加插入一千萬條數(shù)據(jù),實(shí)際導(dǎo)入數(shù)據(jù)節(jié)省的時(shí)間將會(huì)被重新創(chuàng)建一億條數(shù)據(jù)的索引所消耗殆盡,這是我們不希望得到的結(jié)果。但是,如果要導(dǎo)入數(shù)據(jù)的表是空的或?qū)氲臄?shù)據(jù)量比已有的數(shù)據(jù)量要大得多,那么導(dǎo)入數(shù)據(jù)節(jié)省的時(shí)間將會(huì)少量用于重新創(chuàng)建索引,這時(shí)該方法才可以考慮使用。 加快索引創(chuàng)建是另一個(gè)需要考慮的問題。為了減少索引創(chuàng)建中排序的工作時(shí)間,可以在當(dāng)前會(huì)話中增加 SORT_AREA_SIZE 參數(shù)的大小,該參數(shù)允許當(dāng)前會(huì)話在內(nèi)
7、存的索引創(chuàng)建過程中執(zhí)行更多的排序操作。同樣還可以使用 NOLOGGING 關(guān)鍵字來減少因創(chuàng)建索引而生成的 REDO 日志量,NOLOGGING 關(guān)鍵字會(huì)對(duì)數(shù)據(jù)庫的恢復(fù)和 Standby 備用數(shù)據(jù)庫產(chǎn)生明顯的影響,所以在使用之前要仔細(xì)斟酌,到底是速度優(yōu)先還是穩(wěn)定優(yōu)先。運(yùn)用這種方法,先刪除 CALLS 表的主鍵和不唯一的索引,然后逐條導(dǎo)入數(shù)據(jù),完成后重新創(chuàng)建索引( 表在導(dǎo)入數(shù)據(jù)前是空的)。該方法總共消耗 130 秒,包括重建索引的時(shí)間,其中導(dǎo)入進(jìn)程占用 CPU 時(shí)間為 35秒。 這種方法的優(yōu)點(diǎn)是可以加快導(dǎo)入的速度并使索引更加緊湊有效;缺點(diǎn)是缺乏通用性,當(dāng)你對(duì)表增加新的復(fù)雜的模式元素(索引、外鍵等)
8、時(shí)你需要添加代碼、修改導(dǎo)入執(zhí)行程序。另外針對(duì) 7*24 在線要求的數(shù)據(jù)庫在線導(dǎo)入操作時(shí),刪除表的索引會(huì)對(duì)在線用戶的查詢有很大的性能影響,同時(shí)也要考慮,主要或唯一的關(guān)鍵約束條件的刪除或失效可能會(huì)影響到引用它們的外鍵的使用。批量插入,表暫無索引 在Oracle V6 中 OCI 編程接口加入了數(shù)組接口特性。數(shù)組操作允許導(dǎo)入程序讀取外部文件數(shù)據(jù)并解析后,向數(shù)據(jù)庫提交SQL語句,批量插入 SQL 語句檢索出的數(shù)據(jù)。Oracle 僅需要執(zhí)行一次 SQL 語句,然后在內(nèi)存中批量解析提供的數(shù)據(jù)。批量導(dǎo)入操作比逐行插入重復(fù)操作更有效率,這是因?yàn)橹恍枰淮谓馕?SQL 語句,一些數(shù)據(jù)綁訂操作以及程序與數(shù)據(jù)庫之間來
9、回的操作都顯著減少,而且數(shù)據(jù)庫對(duì)每一條數(shù)據(jù)的操作都是重復(fù)可知的,這給數(shù)據(jù)庫提供了優(yōu)化執(zhí)行的可能。其優(yōu)點(diǎn)是數(shù)據(jù)導(dǎo)入的總體時(shí)間明顯減少,特別是進(jìn)程占用 CPU 的時(shí)間。 需要提醒的是,通過 OCI 接口確實(shí)可以執(zhí)行數(shù)據(jù)批量導(dǎo)入操作,但是許多工具和腳本語言卻不支持使用此功能。如果要使用該方法,需要研究你所使用的開發(fā)工具是否支持 OCI 批量操作功能。導(dǎo)入程序需要進(jìn)行復(fù)雜的編碼并可能存在錯(cuò)誤的風(fēng)險(xiǎn),缺乏一定的彈性。 運(yùn)用上述方法,程序?qū)⑼獠繑?shù)據(jù)提取到內(nèi)存中的數(shù)組里,并執(zhí)行批量插入操作(100行/次),保留了表的刪除/重建索引操作,總的導(dǎo)入時(shí)間下降到 14 秒,而進(jìn)程占用 CPU 的時(shí)間下降到7秒,可見
10、實(shí)際導(dǎo)入數(shù)據(jù)所花費(fèi)的時(shí)間顯著下降了 95%。CREATE TABLE AS SELECT,使用Oracle9i的External Table Oracle 9i 的一項(xiàng)新特性就是 External Table,它就象通常的數(shù)據(jù)庫表一樣,擁有字段和數(shù)據(jù)類型約束,并且可以查詢,但是表中的數(shù)據(jù)卻不存儲(chǔ)在數(shù)據(jù)庫中,而是在與數(shù)據(jù)庫相關(guān)聯(lián)的普通外部文件里。當(dāng)你查詢 External Table 時(shí),Oracle 將解析該文件并返回符合條件的數(shù)據(jù),就象該數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫表中一樣。 需要注意的是,你可以在查詢語句中將 External Table 與數(shù)據(jù)庫中其他表進(jìn)行連接(Join),但是不能給 Extern
11、al Table 加上索引,并且不能插入/更新/刪除數(shù)據(jù),畢竟它不是真正的數(shù)據(jù)庫表。另外,如果與數(shù)據(jù)庫相關(guān)聯(lián)的外部文件被改變或者被刪除,這會(huì)影響到 External Table 返回查詢結(jié)果,所以在變動(dòng)前要先跟數(shù)據(jù)庫打招呼。 這種方法為導(dǎo)入數(shù)據(jù)打開了新的一扇門。你可以很容易的將外部文件與數(shù)據(jù)庫相關(guān)聯(lián),并且在數(shù)據(jù)庫中創(chuàng)建對(duì)應(yīng)的 External Table,然后就可以立即查詢數(shù)據(jù),就象外部數(shù)據(jù)已經(jīng)導(dǎo)入到數(shù)據(jù)庫表中一樣。唯一的不足需要明確,數(shù)據(jù)并未真正導(dǎo)入到數(shù)據(jù)庫中,當(dāng)外部文件被刪除或覆蓋時(shí),數(shù)據(jù)庫將不能訪問 External Table 里的數(shù)據(jù),而且索引沒有被創(chuàng)建,訪問數(shù)據(jù)速度將有所緩慢。創(chuàng)建
12、 CALLS_EXTERNAL(External Table表)如下,使之與外部數(shù)據(jù)文件關(guān)聯(lián): CREATE TABLE calls_external (call_id NUMBER, call_date DATE, emp_id NUMBER, call_type VARCHAR2(12), details VARCHAR2(25) ORGANIZATION EXTERNAL (TYPE oracle_loader DEFAULT DIRECTORY extract_files_dir ACCESS PARAMETERS (RECORDS DELIMITED BY NEWLINE FIELD
13、S TERMINATED BY , MISSING FIELD VALUES ARE NULL (call_id, call_date CHAR DATE_FORMAT DATE MASK yyy-mm-dd:hh24:mi:ss, emp_id, call_type, details ) ) LOCATION (calls.dat) ); 然后將 External Table 與真正被使用的表 CALLS 關(guān)聯(lián)同步,刪除 CALLS 表并重建它: CREATE TABLE calls ( call_id NUMBER NOT NULL, call_date DATE NOT NULL, em
14、p_id NUMBER NOT NULL, call_type VARCHAR2(12) NOT NULL, details VARCHAR2(25) ) TABLESPACE tbs1 NOLOGGING AS SELECT call_id, call_date, emp_id, call_type, details FROM calls_external; 因?yàn)?CALLS 表是真正的數(shù)據(jù)庫表,可以創(chuàng)建索引來加快訪問,表中的數(shù)據(jù)將被保留,即使外部數(shù)據(jù)文件被更新或被刪除。在建表語句中NOLOGGING關(guān)鍵字用于加快索引重建。 運(yùn)用這種方法導(dǎo)入數(shù)據(jù),總的導(dǎo)入時(shí)間為 15 秒,進(jìn)程占用 CPU
15、的時(shí)間為8秒,這比前一種方法稍微慢些,但不能就此認(rèn)為使用 External Table 導(dǎo)入數(shù)據(jù)一定比 OCI 批量插入慢。 這種方法的優(yōu)點(diǎn)是,未經(jīng)進(jìn)行大量的編寫代碼就取得了不錯(cuò)的結(jié)果,不象 OCI 批量插入存在編碼錯(cuò)誤風(fēng)險(xiǎn),它還可以使用 dbms_job 包調(diào)度數(shù)據(jù)導(dǎo)入進(jìn)程,實(shí)現(xiàn)數(shù)據(jù)導(dǎo)入的自動(dòng)化。其缺點(diǎn)是目標(biāo)表必須先刪除后重建,如果只需要導(dǎo)入增量數(shù)據(jù)時(shí)此方法就不合適了,另外用戶在表的重建過程中訪問數(shù)據(jù)時(shí)會(huì)遇到 table or view does not exist 的錯(cuò)誤,它僅適用于 Oracle 9i 以上版本的數(shù)據(jù)庫。INSERT Append as SELECT,使用 Oracle9
16、i 的 External Table 上一種方法演示了如何創(chuàng)建與外部數(shù)據(jù)文件關(guān)聯(lián)的數(shù)據(jù)庫表,其表的數(shù)據(jù)是由外部數(shù)據(jù)文件映射過來。缺點(diǎn)是數(shù)據(jù)庫表需要被先刪除再重建來保持與外部數(shù)據(jù)文件的一致和同步,對(duì)導(dǎo)入增量的數(shù)據(jù)而不需要?jiǎng)h除已有數(shù)據(jù)的情況不合適。針對(duì)這種需求,Oracle 提供了 INSERT 語句外帶 APPEND 提示來滿足。 INSERT /*+ APPEND */ INTO calls (call_id, call_date, emp_id, call_type, details) SELECT call_id, call_date, emp_id, call_type, details
17、 FROM calls_external;該語句讀取引用外部數(shù)據(jù)文件的 CALLS_EXTERNAL 表中內(nèi)容,并將之增加到表 CALLS 中。Append 提示告訴 Oracle 使用快速機(jī)制來插入數(shù)據(jù),同時(shí)可以配合使用表的 NOLOGGING 關(guān)鍵字。 可以預(yù)見這種方法與前一方法消耗了相同的時(shí)間,畢竟它們是使用 External Table 特性導(dǎo)入數(shù)據(jù)的不同階段解決方法。如果目標(biāo)表不是空的,那將會(huì)消耗稍微長(zhǎng)的時(shí)間(因?yàn)橐亟ǜL(zhǎng)的索引),而前一 CREATE TABLE as SELECT 方法是整體創(chuàng)建索引。SQL*Loader的強(qiáng)大功能 SQL*Loader 是 Oracle 提供的
18、導(dǎo)入實(shí)用程序,特別針對(duì)從外部文件導(dǎo)入大批量數(shù)據(jù)進(jìn)入數(shù)據(jù)庫表。該工具已經(jīng)有多年的歷史,每一次版本升級(jí)都使其更加強(qiáng)大、靈活和快捷,但遺憾的是它的語法卻是神秘而不直觀,并且只能從命令行窗口處進(jìn)行調(diào)用。 盡管它有不直觀的缺點(diǎn),但卻是最快最有效的導(dǎo)入數(shù)據(jù)方法。缺省情況下它使用 conventional path 常規(guī)選項(xiàng)來批量導(dǎo)入數(shù)據(jù),其性能提高度并不明顯。我建議使用更快速的導(dǎo)入?yún)?shù)選項(xiàng),在命令行添加direct=true 選項(xiàng)調(diào)用 direct path 導(dǎo)入選項(xiàng)。在 direct path 導(dǎo)入實(shí)現(xiàn)中,程序在數(shù)據(jù)庫表的新數(shù)據(jù)塊的 high water mark 處直接寫入導(dǎo)入數(shù)據(jù),縮短了數(shù)據(jù)插入的處
19、理時(shí)間,同時(shí)優(yōu)化使用了非常有效的B+二叉樹方法來更新表的索引。 運(yùn)用這種方法,如果使用缺省的 conventional path 導(dǎo)入選項(xiàng),總的導(dǎo)入時(shí)間是 81 秒,進(jìn)程占用 CPU 時(shí)間大約是 12 秒,這包括了更新表的索引時(shí)間。如果使用 direct path 導(dǎo)入選項(xiàng),總的導(dǎo)入時(shí)間竟是 9 秒,進(jìn)程占用 CPU 時(shí)間也僅僅是 3 秒,也包括了更新表的索引時(shí)間。 由此可見,盡管表中的索引在數(shù)據(jù)導(dǎo)入之前并沒有被刪除,使用SQL*Loader的direct path 導(dǎo)入選項(xiàng)仍然是快速和有效的。當(dāng)然它也有缺點(diǎn),就像NOLOGGING關(guān)鍵字一樣該方法不生成REDO日志數(shù)據(jù),導(dǎo)入進(jìn)程出錯(cuò)后將無法恢
20、復(fù)到先前狀態(tài);在數(shù)據(jù)導(dǎo)入過程中表的索引是不起作用的,用戶此時(shí)訪問該表時(shí)將出現(xiàn)遲緩,當(dāng)然在數(shù)據(jù)導(dǎo)入的過程中最好不要讓用戶訪問表。分區(qū)交換 (Partition Exchange) 以上討論的數(shù)據(jù)導(dǎo)入方法都有一個(gè)限制,就是要求用戶在導(dǎo)入數(shù)據(jù)完成之后才可以訪問數(shù)據(jù)庫表。面對(duì)724不間斷訪問數(shù)據(jù)庫來說,如果我們只是導(dǎo)入需要增加的數(shù)據(jù)時(shí),這種限制將對(duì)用戶的實(shí)時(shí)訪問產(chǎn)生影響。Oracle在這方面提供了表分區(qū)功能,它可以減少導(dǎo)入數(shù)據(jù)操作對(duì)用戶實(shí)時(shí)訪問數(shù)據(jù)的影響,操作模式就象使用可熱插拔的硬盤一樣,只不過這里的硬盤換成了分區(qū)(Partition)而已。需要聲明的是 Partitioning 分區(qū)功能只有在企業(yè)
21、版數(shù)據(jù)庫中才提供。 在一個(gè)被分區(qū)過的表中,呈現(xiàn)給用戶的表是多個(gè)分區(qū)段(segments)的集合。分區(qū)可以在需要時(shí)被添加,在維護(hù)時(shí)被卸載或刪除,分區(qū)表可以和數(shù)據(jù)庫中的表交換數(shù)據(jù),只要它們的表結(jié)構(gòu)和字段類型是一致的,交換后的分區(qū)表將擁有與之互動(dòng)的表的數(shù)據(jù)。需要注意的是,這種交換只是在Oracle數(shù)據(jù)庫的數(shù)據(jù)字典層面上進(jìn)行,并沒有數(shù)據(jù)被實(shí)際移動(dòng),所以分區(qū)表交換是極其快速的。 為了創(chuàng)建實(shí)驗(yàn)環(huán)境,先假設(shè)CALLS表是個(gè)分區(qū)表,要?jiǎng)?chuàng)建一個(gè)空的分區(qū)PART_01012004,用來保存2004年1月1日的呼叫數(shù)據(jù)。然后需要再創(chuàng)建一臨時(shí)表為CALLS_TEMP,該表與CALLS表擁有相同的字段和數(shù)據(jù)類型。 我們
22、使用先前介紹的導(dǎo)入方法將十萬條數(shù)據(jù)導(dǎo)入到CALLS_TEMP表中,可以耐心等待數(shù)據(jù)完全導(dǎo)入到CALLS_TEMP表中,并且創(chuàng)建好索引和相關(guān)約束條件,所有這一切操作并不影響用戶實(shí)時(shí)訪問CALLS表,因?yàn)槲覀冎粚?duì)CALLS_TEMP臨時(shí)表進(jìn)行了操作。一旦數(shù)據(jù)導(dǎo)入完成,CALLS_TEMP表就存有2004年1月1日的呼叫數(shù)據(jù)。同時(shí)利用CALLS表中名為PART_01012004的空分區(qū),使用如下語句執(zhí)行分區(qū)交換: ALTER TABLE calls EXCHANGE PARTITION part_01012004 WITH TABLE calls_temp INCLUDING INDEXES WIT
23、HOUT VALIDATION; 分區(qū)交換操作將非??焖俚刂桓翪ALLS表的數(shù)據(jù)字典,PART_01012004分區(qū)表即刻擁有CALLS_TEMP表的所有數(shù)據(jù),而CALLS_TEMP表變?yōu)榭毡?。假定CALLS表使用局部索引而非全局索引,上述語句中的INCLUDING INDEXES將保證分區(qū)交換包括索引的可用性,WITHOUT VALIDATION 指明不檢查交替表中數(shù)據(jù)的匹配,加快了交換的速度。結(jié)論 以上探討了Oracle數(shù)據(jù)庫的多種數(shù)據(jù)導(dǎo)入方法,每種方法都有其優(yōu)缺點(diǎn)和適用環(huán)境,能夠滿足你不同的導(dǎo)入需求,當(dāng)然你需要在了解了這些方法后,在速度、簡(jiǎn)易性、靈活性、可恢復(fù)性和數(shù)據(jù)可用性之間尋求最佳
24、導(dǎo)入方案。 為了對(duì)比各種方法的效果,我們創(chuàng)建了一個(gè)實(shí)例來展示各種方法的導(dǎo)入效率和效果,從中你可以選擇最適合的方法用于今后的數(shù)據(jù)導(dǎo)入工作。同時(shí)請(qǐng)記住,本文并未囊括所有的ORACLE數(shù)據(jù)導(dǎo)入技術(shù)(比如并行數(shù)據(jù)導(dǎo)入技術(shù)),這需要我們繼續(xù)不懈的探索和嘗試。 數(shù)據(jù)導(dǎo)入方法 總體導(dǎo)入時(shí)間(秒) 導(dǎo)入進(jìn)程占用CPU時(shí)間(秒) 逐條數(shù)據(jù)插入INSERT 172 52 逐條數(shù)據(jù)插入INSERT,表暫無索引 130 35 批量插入,表暫無索引 14 7 Create As Select,使用Oracle9i的External Table 15 8 INSERT Append as SELECT,使用Oracle9
25、i的External Table 15 8 SQL*Loader conventional path 缺省導(dǎo)入選項(xiàng) 81 12 SQL*Loader direct path 導(dǎo)入選項(xiàng) 9 3 數(shù)值函數(shù): abs(m) m的絕對(duì)值 mod(m,n) m被n除后的余數(shù) power(m,n) m的n次方 round(m,n) m四舍五入至小數(shù)點(diǎn)后n位的值(n缺省為0) trunc(m,n) m截?cái)鄋位小數(shù)位的值(n缺省為0) 字符函數(shù): initcap(st) 返回st將每個(gè)單詞的首字母大寫,所有其他字母小寫 lower(st) 返回st將每個(gè)單詞的字母全部小寫 upper(st) 返回st將每個(gè)單
26、詞的字母全部大寫 concat(st1,st2) 返回st為st2接st1的末尾(可用操作符|) lpad(st1,n,st2) 返回右對(duì)齊的st,st為在st1的左邊用st2填充直至長(zhǎng)度為n,st2的缺省為空格 rpad(st1,n,st2) 返回左對(duì)齊的st,st為在st1的右邊用st2填充直至長(zhǎng)度為n,st2的缺省為空格 ltrim(st,set) 返回st,st為從左邊刪除set中字符直到第一個(gè)不是set中的字符。缺省時(shí),指的是空格 rtrim(st,set) 返回st,st為從右邊刪除set中字符直到第一個(gè)不是set中的字符。缺省時(shí),指的是空格 replace(st,search_s
27、t,replace_st) 將每次在st中出現(xiàn)的search_st用replace_st替換,返回一個(gè)st。缺省時(shí),刪除search_st substr(st,m,n) n=返回st串的子串,從m位置開始,取n個(gè)字符長(zhǎng)。缺省時(shí),一直返回到st末端 length(st) 數(shù)值,返回st中的字符數(shù) instr(st1,st2,m,n) 數(shù)值,返回st1從第m字符開始,st2第n次出現(xiàn)的位置,m及n的缺省值為1 例: 1. select initcap(THOMAS),initcap(thomas) from test; initca initca - - Thomas Thomas 2. sele
28、ct concat(abc,def) first from test; first - abcdef 3. select abc| |def first from test; first - abc def 4. select lpad(name,10),rpad(name,5,*) from test; lpad(name,10) rpad(name,5,*) - - mmx mmx* abcdef abcde 5. 去掉地址字段末端的點(diǎn)及單詞st和rd select rtrim(address,. st rd) from test 6. select name,replace(name,a
29、,*) from test; name replace(name,a,*) - - great gre*t 7. select substr(archibald bearisol,6,9) a,substr(archibald bearisol,11) b from test; a b - - bald bear bearisol 8. select name,instr(name, ) a,instr(name, ,1,2) b from test; name a b - - - li lei 3 0 l i l 2 4 轉(zhuǎn)換函數(shù): nvl(m,n) 如果m值為null,返回n,否則返回m
30、to_char(m,fmt) m從一個(gè)數(shù)值轉(zhuǎn)換為指定格式的字符串fmt缺省時(shí),fmt值的寬度正好能容納所有的有效數(shù)字 to_number(st,fmt) st從字符型數(shù)據(jù)轉(zhuǎn)換成按指定格式的數(shù)值,缺省時(shí)數(shù)值格式串的大小正好為整個(gè)數(shù) 附: to_char()函數(shù)的格式: - 符號(hào) 說明 - 9 每個(gè)9代表結(jié)果中的一位數(shù)字 0 代表要顯示的先導(dǎo)0 $ 美元符號(hào)打印在數(shù)的左邊 L 任意的當(dāng)?shù)刎泿欧?hào) . 打印十進(jìn)制的小數(shù)點(diǎn) , 打印代表千分位的逗號(hào) - 例: 1. select to_number(123.45)+to_number(234.56) form test; to_number(123.4
31、5)+to_number(234.56) - 358.01 2. select to_char(987654321) from test; to_char(987654321) - 987654321 3. select to_char(123,$9,999,999) a,to_char(54321,$9,999,999) b,to_char(9874321,$9,999,999) c from test; a b c - - - $123 $54,321 $9,874,321 4. select to_char(1234.1234,999,999.999) a,to_char(0.4567,999,999.999) b,to_char(1.1,999,999.999) from test; a b c - - - 1,234.123 .457 1.100 分組函數(shù): avg(distinct/all n) 列n的平均值 count(all *) 返回
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年電子行業(yè)并購與轉(zhuǎn)型分析報(bào)告
- 街道房屋委托租賃合同范本
- 2025年度工業(yè)機(jī)器人應(yīng)用集成合同
- 借借款合同范本
- 買墓地簽合同范本
- 產(chǎn)品購銷安裝合同范本
- 2025年高級(jí)休閑服行業(yè)深度研究分析報(bào)告
- 2025年度建筑植筋加固施工與驗(yàn)收規(guī)范合同
- 2025年度建筑施工附屬工程合同續(xù)期合同
- 2025年中國(guó)政府IT應(yīng)用行業(yè)發(fā)展運(yùn)行現(xiàn)狀及發(fā)展趨勢(shì)預(yù)測(cè)報(bào)告
- 2023-2024學(xué)年五年級(jí)下冊(cè)數(shù)學(xué)青島版小升初測(cè)評(píng)卷(五四學(xué)制)
- 2024年陜西省中考語文試題
- 北京海淀人大附2025屆高一數(shù)學(xué)第二學(xué)期期末監(jiān)測(cè)試題含解析
- ALC板施工施工方案及工藝要求
- 漂流規(guī)劃設(shè)計(jì)方案
- 移動(dòng)取消寬帶委托書
- 國(guó)際市場(chǎng)營(yíng)銷(高職)教學(xué)教案
- 消防設(shè)施維保服務(wù)投標(biāo)方案
- 圖圖身體部位-課件
- 親歷電子病歷系統(tǒng)分級(jí)評(píng)價(jià)四級(jí)參評(píng)紀(jì)實(shí)-2022醫(yī)院信息化
- 情景交際-2022年中考英語真題匯編(全國(guó)通用)
評(píng)論
0/150
提交評(píng)論