一、 提高DML操作的辦法:\x0d\x0a簡(jiǎn)單說(shuō)來(lái):\x0d\x0a1、暫停索引,更新后恢復(fù).避免在更新的過(guò)程中涉及到索引的重建.\x0d\x0a2、批量更新,每更新一些記錄后及時(shí)進(jìn)行提交動(dòng)作.避免大量占用回滾段和或臨時(shí)表空間.\x0d\x0a3、創(chuàng)建一臨時(shí)的大的表空間用來(lái)應(yīng)對(duì)這些更新動(dòng)作.\x0d\x0a\x0d\x0a4、批量更新,每更新一些記錄后及時(shí)進(jìn)行提交動(dòng)作.避免大量占用回滾段和或臨時(shí)表空間.\x0d\x0a\x0d\x0a5、創(chuàng)建一臨時(shí)的大的表空間用來(lái)應(yīng)對(duì)這些更新動(dòng)作.\x0d\x0a\x0d\x0a6、加大排序緩沖區(qū)\x0d\x0a alter session set sort_area_size=100000000;\x0d\x0a insert into tableb select * from tablea;\x0d\x0a commit;\x0d\x0a\x0d\x0a如果UPDATE的是索引字段,就會(huì)涉及到索引的重建,暫停索引不會(huì)提高多少的速度,反而有可能降低UPDATE速度,\x0d\x0a因?yàn)樵诟率撬饕梢蕴岣邤?shù)據(jù)的查詢(xún)速度,重建索引引起的速度降低影響不大。\x0d\x0a\x0d\x0aORACLE優(yōu)化修改參數(shù)最多也只能把性能提高15%,大部分都是SQL語(yǔ)句的優(yōu)化!\x0d\x0a\x0d\x0aupdate總體來(lái)說(shuō)比insert要慢 :\x0d\x0a幾點(diǎn)建議: \x0d\x0a 1、如果更新的數(shù)據(jù)量接近整個(gè)表,就不應(yīng)該使用index而應(yīng)該采用全表掃描 \x0d\x0a 2、減少不必要的index,因?yàn)閡pdate表通常需要update index \x0d\x0a 3、如果你的服務(wù)器有多個(gè)cpu,采用parellel hint,可以大幅度的提高效率\x0d\x0a 另外,建表的參數(shù)非常重要,對(duì)于更新非常頻繁的表,建議加大PCTFREE的值,以保證數(shù)據(jù)塊中有足夠的空間用于UPDATE, 從而降低CHAINED_ROWS。 \x0d\x0a\x0d\x0a二、 各種批量DML操作:\x0d\x0a(1)、oracle批量拷貝:\x0d\x0aset arraysize 20\x0d\x0a set copycommit 5000\x0d\x0a copy from username/password@oraclename append table_name1\x0d\x0a using select * from table_name2;\x0d\x0a (2)、常規(guī)插入方式:\x0d\x0a insert into t1 select * from t;\x0d\x0a 為了提高速度可以使用下面方法,來(lái)減少插入過(guò)程中產(chǎn)生的日志:\x0d\x0a alter table t1 nologging;\x0d\x0ainsert into t1 select * from t;\x0d\x0acommit;\x0d\x0a (3)、CTAS方式:\x0d\x0a create table t1\x0d\x0aas\x0d\x0aselect * from t;\x0d\x0a為了提高速度可以使用下面方法,來(lái)減少插入過(guò)程中產(chǎn)生的日志,并且可以制定并行度:\x0d\x0acreate table t1 nologging parallel(degree 2) as select * from t;\x0d\x0a (4)、Direct-Path插入:\x0d\x0a insert /*+append*/ into t1 select * from t;\x0d\x0a commit;\x0d\x0a 為了提高速度可以使用下面方法,來(lái)減少插入過(guò)程中產(chǎn)生的日志:\x0d\x0a alter table t1 nologging;\x0d\x0a insert /*+append*/ into t1 select * from t;\x0d\x0a \x0d\x0a Direct-Path插入特點(diǎn):\x0d\x0a1、 append只在insert ? select ?中起作用,像insert /*+ append */ into t values(?)這類(lèi)的語(yǔ)句是不起作用的。在update、delete操作中,append也不起作用。\x0d\x0a2、 Direct-Path會(huì)使數(shù)據(jù)庫(kù)不記錄直接路徑導(dǎo)入的數(shù)據(jù)的重做日志,會(huì)對(duì)恢復(fù)帶來(lái)麻煩。\x0d\x0a3、 Direct-Path直接在表段的高水位線以上的空白數(shù)據(jù)塊中寫(xiě)數(shù)據(jù),不會(huì)重用高水位線以下的空間,會(huì)對(duì)空間的使用造成一定的浪費(fèi),對(duì)查詢(xún)的性能也會(huì)造成一定的影響。而常規(guī)插入會(huì)優(yōu)先考慮使用高水位線之下有空閑空間存在的數(shù)據(jù)塊。因此理論上Direct-Path插入會(huì)比常規(guī)插入速度更快,因?yàn)镈irect-Path直接使用新數(shù)據(jù)塊,而常規(guī)插入要遍歷freelist獲取可用空閑數(shù)據(jù)塊,如果同 nologging 配合,這種速度優(yōu)勢(shì)會(huì)更加明顯。\x0d\x0a4、 以append方式插入記錄后,要執(zhí)行commit,才能對(duì)表進(jìn)行查詢(xún)。否則會(huì)出現(xiàn)錯(cuò)誤:ORA-12838: 無(wú)法在并行模式下修改之后讀/修改對(duì)象。\x0d\x0a5、 用append導(dǎo)入數(shù)據(jù)后,如果沒(méi)有提交或者回滾,在其他會(huì)話中任何對(duì)該表的DML都會(huì)被阻塞(不會(huì)報(bào)錯(cuò)),但對(duì)該表的查詢(xún)可以正常執(zhí)行。\x0d\x0a6、 在歸檔模式下,要把表設(shè)置為nologging,然后以append方式批量添加記錄,才會(huì)顯著減少redo數(shù)量。在非歸檔模式下,不必設(shè)置表的 nologging屬性,即可減少redo數(shù)量。如果表上有索引,則append方式批量添加記錄,不會(huì)減少索引上產(chǎn)生的redo數(shù)量,索引上的redo 數(shù)量可能比表的redo數(shù)量還要大。\x0d\x0a7、 數(shù)據(jù)直接插入數(shù)據(jù)文件,繞過(guò)buffer cache并且忽略了引用完整性約束。\x0d\x0a8、 不管表是否在nologging 下,只要是 direct insert,就不會(huì)對(duì)數(shù)據(jù)內(nèi)容生成undo。\x0d\x0a9、 Oracle在Direct-Path INSERT 操作末尾,對(duì)具有索引的表執(zhí)行索引維護(hù),這樣就避免了在drop掉索引后,再rebuild。\x0d\x0a10、 Direct-Path INSERT比常規(guī)的插入需要更多的空間。因?yàn)樗鼘?shù)據(jù)插入在高水位之上。并行插入非分區(qū)表需要更多的空間,因?yàn)樗枰獮槊恳粋€(gè)并行線程創(chuàng)建臨時(shí)段。\x0d\x0a11、 在插入期間,數(shù)據(jù)庫(kù)在表上獲得排他鎖,用戶(hù)不能在表上執(zhí)行并行插入、更新或者刪除操作,并行的索引創(chuàng)建和build也不被允許。但卻可以并行查詢(xún),但查詢(xún)返回的是插入之前的結(jié)果集。\x0d\x0a (5)、并行DML:\x0d\x0a 如果你的服務(wù)器有多個(gè)cpu,采用parellel hint,可以大幅度的提高效率\x0d\x0a ALTER SESSION ENABLE PARALLEL DML;\x0d\x0a\x0d\x0a INSERT /*+ PARALLEL(tableA, 2) */INTO tableA \x0d\x0a SELECT * FROM tableB;\x0d\x0a\x0d\x0a 為了提高速度可以使用下面方法,來(lái)減少插入過(guò)程中產(chǎn)生的日志:\x0d\x0a\x0d\x0a INSERT /*+ PARALLEL(tableA, 2) */INTO tableA NOLOGGING\x0d\x0a SELECT * FROM tableB;\x0d\x0a\x0d\x0aoracle默認(rèn)并不會(huì)打開(kāi)PDML,對(duì)DML語(yǔ)句必須手工啟用。即需要執(zhí)行\(zhòng)x0d\x0aalter table enable parallel dml命令。\x0d\x0a \x0d\x0a并行DML特點(diǎn):\x0d\x0a1、在并行DML模式中,默認(rèn)的就是DIRECT-PATH插入,為了運(yùn)行并行DML模式,必須滿(mǎn)足以下條件:\x0d\x0aa、必須是Oracle企業(yè)版;\x0d\x0ab、必須在session中使并行DML生效,執(zhí)行以下sql語(yǔ)句:\x0d\x0aALTER SESSION { ENABLE | FORCE } PARALLEL DML;\x0d\x0ac、必須指定table的并行屬性,在創(chuàng)建的時(shí)候或者其他時(shí)候,或者在insert操作時(shí)使用“PARALLEL”提示。\x0d\x0ad、為了使Direct-Path Insert模式失效,在INSERT語(yǔ)句中指定“NOAPPEND”提示,覆蓋并行DML模式。\x0d\x0a 2、并行Direct-Path INSERT到分區(qū)表:\x0d\x0a 類(lèi)似于serial Direct-Path INSERT,每個(gè)并行操作分配給一個(gè)或者多個(gè)分區(qū),每個(gè)并行操作插入數(shù)據(jù)到各自的分區(qū)段的高水位標(biāo)志之上,commit之后,用戶(hù)就能看到更新的數(shù)據(jù)。\x0d\x0a 3、并行Direct-Path INSERT到非分區(qū)表:\x0d\x0a 每個(gè)并行執(zhí)行分配一個(gè)新的臨時(shí)段,并插入數(shù)據(jù)到臨時(shí)段。當(dāng)commit運(yùn)行后,并行執(zhí)行協(xié)調(diào)者合并新的臨時(shí)段到主表段,用戶(hù)就能看到更新的數(shù)據(jù)。\x0d\x0a 4、Direct-Path INSERT可以使用Log或者不使用Log。\x0d\x0a 5、另外不得不說(shuō)的是,并行不是一個(gè)可擴(kuò)展的特性,只有在數(shù)據(jù)倉(cāng)庫(kù)或作為DBA等少數(shù)人的工具在批量數(shù)據(jù)操作時(shí)利于充分利用資源,而在OLTP環(huán)境下使用并行需要非常謹(jǐn)慎。事實(shí)上PDML還是有比較多的限制的,例如不支持觸發(fā)器,引用約束,高級(jí)復(fù)制和分布式事務(wù)等特性,同時(shí)也會(huì)帶來(lái)額外的空間占用,PDDL同 樣是如此。
成都創(chuàng)新互聯(lián)公司-專(zhuān)業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性?xún)r(jià)比詔安網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式詔安網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋詔安地區(qū)。費(fèi)用合理售后完善,十余年實(shí)體公司更值得信賴(lài)。
oracle對(duì)于大文本數(shù)據(jù)用clob類(lèi)型。但對(duì)于這個(gè)類(lèi)型處理起來(lái)還是比較麻煩的,varchar2長(zhǎng)度為4000bytes,如果varchar2能滿(mǎn)足您的需求,建議使用varchar2。
【問(wèn)題拓展展】
CHAR類(lèi)型 CHAR(size [BYTE | CHAR])
CHAR類(lèi)型,定長(zhǎng)字符串,會(huì)用空格填充來(lái)達(dá)到其最大長(zhǎng)度。非NULL的CHAR(12)總是包含12字節(jié)信息。CHAR字段最多可以存儲(chǔ)2,000字節(jié)的信息。如果創(chuàng)建表時(shí),不指定CHAR長(zhǎng)度,則默認(rèn)為1。另外你可以指定它存儲(chǔ)字節(jié)或字符,例如 CHAR(12 BYTYE) CHAR(12 CHAR).一般來(lái)說(shuō)默認(rèn)是存儲(chǔ)字節(jié),你可以查看數(shù)據(jù)庫(kù)參數(shù)
NLS_LENGTH_SEMANTICS的值。
將文本文件導(dǎo)入Oracle中需要用sqlloader的方式。
1、在數(shù)據(jù)庫(kù)中創(chuàng)建相應(yīng)的表。
如,文本文件內(nèi)容為:
create?table?test
(id?int,
name?varchar2(10),
sex?varchar2(10));
2、在電腦中某路徑下編寫(xiě)ctrl文件,以c盤(pán)data目錄為例,添加如下文本。如,被導(dǎo)入的文件名為load.txt
load???data???
infile???'load.txt'??--被導(dǎo)入文件名
replace?into???table???test?????
(id???char???terminated???by???',',???
name???char???terminated???by???',',???
sex???char???terminated???by???whitespace)
編寫(xiě)后,將文件保存成load.ctrl
3、然后打開(kāi)命令提示符,并進(jìn)入到文本文件和ctrl文件所在目錄。
4、輸入以下語(yǔ)句,并執(zhí)行。
sqlldr?userid=用戶(hù)名/密碼@數(shù)據(jù)庫(kù)實(shí)例名???control=load.ctl???log=load.log
5、導(dǎo)入后,test表中數(shù)據(jù)如下:
測(cè)試方法:Dos 下輸入 C:\sqlplus username/password@serviceName 2、然后使用 Oracle 的 sqlldr 命令進(jìn)行數(shù)據(jù)的導(dǎo)入 前期條件 1)Oracle 數(shù)據(jù)庫(kù)端必須已經(jīng)建好了需要導(dǎo)入的數(shù)據(jù)表的結(jié)構(gòu) 2)一個(gè)數(shù)據(jù)源文件 下面例子中為制表符分隔的文本文件 model.txt ,為Excel 表中導(dǎo)出的 3)手工編輯一個(gè)XXX.CTL 的控制文件 4)命令行加載數(shù)據(jù) 如下實(shí)例: 以下文件缺省放到C:\ 下,如果不是,就需要指明全路徑 1.命令控制文件 input.ctl 內(nèi)容 控制文件中指定插入數(shù)據(jù)的方式關(guān)鍵字 insert,為缺省方式,在數(shù)據(jù)裝載開(kāi)始時(shí)要求表為空 append,在表中追加新記錄 replace,刪除舊記錄,替換成新裝載的記錄 truncate,同上 在Dos 窗口下使用 SQl*Loader 命令實(shí)現(xiàn)數(shù)據(jù)的導(dǎo)入 C:\sqlldr userid=system/manager@ serviceName control=input.ctl 默認(rèn)日志文件名為:input.log 默認(rèn)壞記錄文件為:input.bad 使用其它數(shù)據(jù)庫(kù)轉(zhuǎn)移工具以下以SQL Server 導(dǎo)入導(dǎo)出向?qū)槔?1、在數(shù)據(jù)的導(dǎo)入導(dǎo)出向?qū)е性O(shè)置數(shù)據(jù)源服務(wù)器,實(shí)例中選擇數(shù)據(jù)源選擇SQL Server 2、然后指定要導(dǎo)入的Oracle 數(shù)據(jù)源 3、需要配置Oracle 的屬性信息 需要注意的是,登錄數(shù)據(jù)庫(kù)的用戶(hù)信息即為數(shù)據(jù)導(dǎo)入之后的方案名,即導(dǎo)入之后的SQL Server 中的表在Oracle 中標(biāo)志名為 username.表名以下按照提示即可,可以完全導(dǎo)入SQl Server 中的數(shù)據(jù)表和視圖,也可以使用查詢(xún)語(yǔ)句返回你要選擇的列或者行。
1、對(duì)于Oracle Enterprise Manager中的所有工具,有一個(gè)配置文件名為dbappscfg.properties,修改該文件即可解決上述問(wèn)題。這個(gè)文件的位置在$ORACLE_HOME\sysman\config目錄下,用任何的文本編輯器打開(kāi)該文件,在這個(gè)文件里面,找到這樣一項(xiàng),
# SQLPLUS_NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
2、去掉注釋符#,同時(shí)將其修改為
SQLPLUS_NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
3、對(duì)于Windows操作系統(tǒng),還需要修改一項(xiàng),在文件中找到# SQLPLUS_SYSTEMROOT=c:\\WINNT40,去掉注釋符,將其修改為你所在機(jī)器的操作系統(tǒng)主目錄。如操作系統(tǒng)的主目錄在D盤(pán)的Winnt下,則將其修改為
SQLPLUS_SYSTEMROOT=d:\\WINNT。
對(duì)于后面一項(xiàng)的修改只對(duì)Windows操作系統(tǒng)進(jìn)行,對(duì)UNIX操作系統(tǒng)則不需要。如果在Windows操作系統(tǒng)中不修改該項(xiàng),在Oracle Enterprise Manager中,連接系統(tǒng)時(shí),會(huì)提示如下的錯(cuò)誤:
ORA-12560 TNS:protocol adapter error
或者
ORA-12545 Connect failed because target host or object does not exist
4、修改完成后,保存文件,退出編輯。重新連接SQL PLUS Worksheet,字符集亂碼問(wèn)題得到解決,顯示正確的簡(jiǎn)體中文字符集。
問(wèn)題: 使用Oracle Instant Client 出現(xiàn) ORA-12705: Cannot access NLS data files or invalid environment specified 錯(cuò)誤。
如果是Windows平臺(tái),注冊(cè)表里 \HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE 查找鍵 NLS_LANG,這個(gè)鍵由Oracle標(biāo)準(zhǔn)客戶(hù)端安裝創(chuàng)建, 值是 NA 。這個(gè)導(dǎo)致了 ORA-12705錯(cuò)誤。解決方法就是改名 NLS_LANG。
Linux下 如果環(huán)境變量 NLS_LANG 值是NA 會(huì)引起 ORA-12705 錯(cuò)誤,解決方法是刪除這個(gè)變量
unset NLS_LANG
Oracle
CHAR 定長(zhǎng)字符串,最長(zhǎng)2000字節(jié)
NCHAR 定長(zhǎng)字符串,存儲(chǔ)的數(shù)據(jù)為 NLS字符
VARCHAR2 變長(zhǎng)字符串,最長(zhǎng)4000字節(jié)
NVARCHAR2 變長(zhǎng)字符串,存儲(chǔ)的數(shù)據(jù)為 NLS字符
LONG 最大存儲(chǔ)2G字符數(shù)據(jù) 不推薦使用(改用CLOB)
CLOB Oracle 9i 及以前,最大4G字符數(shù)據(jù)
Oracle10g 最大4G*數(shù)據(jù)庫(kù)塊大小的字符數(shù)據(jù)
NCLOB 基本同CLOB,就是存儲(chǔ)的數(shù)據(jù)為NLS
標(biāo)題名稱(chēng):oracle文本怎么處理,oracle 寫(xiě)文件
文章網(wǎng)址:http://chinadenli.net/article18/heigdp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、網(wǎng)站設(shè)計(jì)、網(wǎng)站設(shè)計(jì)公司、網(wǎng)站制作、ChatGPT、定制開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容