【原創】比較使用sql*loader的直接載入方式和傳統載入方式的效能差異
一 資料庫版本
SYS@LEO1>select* from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise EditionRelease 11.2.0.1.0 - 64bit Production
PL/SQLRelease 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS forLinux: Version 11.2.0.1.0 - Production
NLSRTLVersion 11.2.0.1.0 – Production
作業系統資訊
[oracle@leonarding1admin]$ uname -a
Linuxleonarding1.oracle.com 2.6.32-200.13.1.el5uek #1 SMP Wed Jul 27 21:02:33 EDT 2011x86_64 x86_64 x86_64 GNU/Linux
二比較使用sql*loader的直接載入方式和傳統載入方式的效能差異,給出演示過程和結論。
第一 我們先要生成平面資料(文字資料)
LEO1@LEO1>create table leo2 as select *from dba_objects; 建立資料來源,我們的平面資料就是從這個表中取出
Table created.
第二 我們利用spool工具將螢幕中顯示出來的記錄寫入到指定檔案,這樣我們就可以得到一個平面檔案啦
set termout off; 是否在螢幕上顯示輸出內容,off螢幕不顯示查詢語句,主要與spool結合使用
set feedback off; 關閉本次sql命令處理的記錄條數,預設為on即去掉最後的已經選擇的行數
set echo off; 關閉指令碼中正在執行的SQL語句的顯示
set heading off; 關閉標題的輸出,設定為off就去掉了select結果的欄位名只顯示資料
set trimout on; 去除標準輸出每行後面多餘的空格
set trimspool on; 將每行後面多餘的空格去掉【linesize-實際字元數=多餘空格】
spool /home/oracle/sql_loader/leo3.txt 在螢幕上的所有內容都包含在該檔案中
select owner||','||object_name||','||object_id||','||object_typefrom leo2;
spool off 只有關閉spool輸出,才會在輸出檔案中看到輸出的內容
備註:在實用SPOOL輸出內容到本地檔案時,需注意編碼格式,否則會出現亂碼的問題
[oracle@leonarding1 sql_loader]$ ll
total 28468
-rw-r--r-- 1 oracle oinstall 3246601 Jun 22 14:06 leo3.txt 已經生成平面檔案leo3.txt
[oracle@leonarding1 sql_loader]$ cat leo3.txt| wc -l 檔案中有72678行記錄
72678
第三 建立裝入的表leo3_loader
LEO1@LEO1>create table leo3_loader
(
owner varchar2(30),
object_name varchar2(130),
object_id number,
object_type varchar2(20)
);
2 3 4 5 6 7
第四 建立sql*loader的控制檔案leo3_loader.ctl
[oracle@leonarding1 sql_loader]$ vim leo3_loader.ctl
load data
infile '/home/oracle/sql_loader/leo3.txt' 待載入的資料檔案
badfile '/home/oracle/sql_loader/leo3_bad.txt' 格式不匹配寫入壞檔案
discardfile'/home/oracle/sql_loader/leo3_discard.txt' 條件不匹配寫入丟棄檔案
append into table leo3_loader 追加的方式插入資料
fields terminated by "," 欄位與欄位之間的分隔符
trailing nullcols 這句的意思是將沒有對應值的列都置為null
(owner,object_name,object_id,object_type) 資料插入的對應欄位
第五 執行sqlldr直接載入命令
[oracle@leonarding1 sql_loader]$ sqlldrleo1/leo1 control=leo3_loader.ctl log=leo3_loader.log direct=true
SQL*Loader: Release 11.2.0.1.0 - Productionon Sat Jun 22 14:08:31 2013
Copyright (c) 1982, 2009, Oracle and/or itsaffiliates. All rights reserved.
Load completed - logical record count72678.
已經載入了72678行,條件不匹配有72行,實際載入入72606行
LEO1@LEO1>select count(*) fromleo3_loader; 表中也是
72606
我們在看一下sql*loader日誌
。。。省略前部份。。。
Total logical records skipped: 0
Total logical recordsread: 72678
Total logical records rejected: 0
Total logical records discarded: 72 條件不匹配有72行
Total stream buffers loaded by SQL*Loadermain thread: 17
Total stream buffers loaded by SQL*Loaderload thread: 6
Run began on Sat Jun 22 14:08:31 2013
Run ended on Sat Jun 22 14:08:34 2013
Elapsed time was: 00:00:02.60 所用耗時2.6秒
CPU time was: 00:00:00.13
使用conventional傳統載入方式寫入資料
LEO1@LEO1>truncate table leo3_loader; 清空表在載入一次
[oracle@leonarding1 sql_loader]$ sqlldrleo1/leo1 control=leo3_loader.ctl log=leo3_loader.log
LEO1@LEO1>select count(*) fromleo3_loader; 表中也是
72606
我們在看一下sql*loader日誌
。。。省略前部份。。。
Total logical records skipped: 0
Total logical recordsread: 72678
Total logical records rejected: 0
Total logical records discarded: 72 條件不匹配有72行
Run began on Sat Jun 22 15:25:45 2013
Run ended on Sat Jun 22 15:26:05 2013
Elapsed time was: 00:00:20.79 所用耗時2.6秒
CPU time was: 00:00:00.48
小結:經過比對direct比conventional要提高了20倍效率,為什麼direct會這麼高效呢,下面我們來說說這兩種的區別。
Direct 特點
(1)資料繞過SGA直接寫入磁碟的資料檔案
(2)資料直接寫入高水位線HWM之後的新塊,不會掃描HWM之前的空閒塊
(3)commit之後移動HWM他人才能看到
(4)不對已用空間進行掃描
(5)使用direct幾乎不產生redo log,不是完全不產生(安全性差),但會產生undo資料
(6)適用OLAP線上分析場景,增 刪 改不頻繁的場景
Conventional傳統載入特點
(1)資料先載入 -> SGA -> 磁碟的資料檔案
(2)會掃描高水位線HWM之前的資料塊,如果有空閒塊(碎片經常DML導致)就會利用,如果沒有再插入新塊
(3)高水位線HWM之前的資料塊是放在SGA區的
(4)會產生redo log和undo資料
(5)安全性高,可恢復資料
(6)傳統載入與SQL語句insert插入沒區別
2013.6.22
北京&summer
分享技術~成就夢想
Blog:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26686207/viewspace-764594/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用sqlloader的直接載入方式和傳統載入方式的效能差異SQL
- 【原創】比較資料泵和exp/imp對相同資料匯出/匯入的效能差異
- View的載入原理和攔截方式View
- 小說APP原始碼的圖片載入方式,懶載入和預載入的實現APP原始碼
- [轉載] SQL server 差異備份和還原SQLServer
- 多重載入Bean方式Bean
- 載入圖片方式
- 關於angularjs的載入方式AngularJS
- Vue中圖片的載入方式Vue
- 現代化懶載入的方式
- OpenSSL Engine的三種載入方式
- 效能更優越的小程式圖片懶載入方式
- JavaScript 檔案載入方式JavaScript
- 使用jQuery和YQL,以Ajax方式載入外部內容jQuery
- 用SQL*Loader載入外部資料SQL
- Python頁面載入的等待方式Python
- 不一樣的圖片載入方式
- spring 載入配置檔案的方式Spring
- LVS:三種負載均衡方式比較+另三種負載均衡方式負載
- SQL Server資料庫匯入匯出資料方式比較SQLServer資料庫
- 前端效能優化(四)——網頁載入更快的N種方式前端優化網頁
- 直接載入和並行記載-01並行
- 一對一聊天軟體原始碼,提升系統效能的圖片載入方式原始碼
- LVS 三種負載均衡方式比較負載
- tensorflow載入資料的三種方式
- 谷歌:如何以最高效的方式載入 WebAssembly谷歌Web
- 直接載入和並行-02並行
- 線上json差異比較工具--遞迴比較兩個json的節點和值的差異,並支援差異數預覽和逐個檢視差異JSON遞迴
- LVS-三種負載均衡方式比較負載
- HBase協處理器載入的三種方式
- 實現圖片懶載入的三種方式
- 並行直接載入和系統調整的一點思路並行
- 使用事務碼 SAT 比較 SELECT SQL 語句和 OPEN / FETCH CURSOR 分塊讀取的效能差異SQL
- XML資料讀取方式效能比較XML
- 請教關於spring 兩種組合載入方式的使用?Spring
- spring bean定義與載入方式SpringBean
- unity3D AssetBundle載入方式Unity3D
- iOS彈幕高效載入實現方式iOS