欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

oracle如何加速數(shù)據(jù),oracle查詢速度優(yōu)化

如何進行oracle數(shù)據(jù)庫性能優(yōu)化

你最好買一本專門講ORACLE性能優(yōu)化的書,好好看看\x0d\x0a1、調(diào)整數(shù)據(jù)庫服務(wù)器的性能\x0d\x0aOracle數(shù)據(jù)庫服務(wù)器是整個系統(tǒng)的核心,它的性能高低直接影響整個系統(tǒng)的性能,為了調(diào)整Oracle數(shù)據(jù)庫服務(wù)器的性能,主要從以下幾個方面考慮: \x0d\x0a1.1、調(diào)整操作系統(tǒng)以適合Oracle數(shù)據(jù)庫服務(wù)器運行\(zhòng)x0d\x0aOracle數(shù)據(jù)庫服務(wù)器很大程度上依賴于運行服務(wù)器的操作系統(tǒng),如果操作系統(tǒng)不能提供最好性能,那么無論如何調(diào)整,Oracle數(shù)據(jù)庫服務(wù)器也無法發(fā)揮其應(yīng)有的性能。 \x0d\x0a1.1.1、為Oracle數(shù)據(jù)庫服務(wù)器規(guī)劃系統(tǒng)資源 \x0d\x0a據(jù)已有計算機可用資源, 規(guī)劃分配給Oracle服務(wù)器資源原則是:盡可能使Oracle服務(wù)器使用資源最大化,特別在Client/Server中盡量讓服務(wù)器上所有資源都來運行Oracle服務(wù)。 \x0d\x0a1.1.2、調(diào)整計算機系統(tǒng)中的內(nèi)存配置 \x0d\x0a多數(shù)操作系統(tǒng)都用虛存來模擬計算機上更大的內(nèi)存,它實際上是硬盤上的一定的磁盤空間。當實際的內(nèi)存空間不能滿足應(yīng)用軟件的要求時,操作系統(tǒng)就將用這部分的磁盤空間對內(nèi)存中的信息進行頁面替換,這將引起大量的磁盤I/O操作,使整個服務(wù)器的性能下降。為了避免過多地使用虛存,應(yīng)加大計算機的內(nèi)存。 \x0d\x0a1.1.3、為Oracle數(shù)據(jù)庫服務(wù)器設(shè)置操作系統(tǒng)進程優(yōu)先級 \x0d\x0a不要在操作系統(tǒng)中調(diào)整Oracle進程的優(yōu)先級,因為在Oracle數(shù)據(jù)庫系統(tǒng)中,所有的后臺和前臺數(shù)據(jù)庫服務(wù)器進程執(zhí)行的是同等重要的工作,需要同等的優(yōu)先級。所以在安裝時,讓所有的數(shù)據(jù)庫服務(wù)器進程都使用缺省的優(yōu)先級運行。 \x0d\x0a1.2、調(diào)整內(nèi)存分配\x0d\x0aOracle數(shù)據(jù)庫服務(wù)器保留3個基本的內(nèi)存高速緩存,分別對應(yīng)3種不同類型的數(shù)據(jù):庫高速緩存,字典高速緩存和緩沖區(qū)高速緩存。庫高速緩存和字典高速緩存一起構(gòu)成共享池,共享池再加上緩沖區(qū)高速緩存便構(gòu)成了系統(tǒng)全程區(qū)(SGA)。SGA是對數(shù)據(jù)庫數(shù)據(jù)進行快速訪問的一個系統(tǒng)全程區(qū),若SGA本身需要頻繁地進行釋放、分配,則不能達到快速訪問數(shù)據(jù)的目的,因此應(yīng)把SGA放在主存中,不要放在虛擬內(nèi)存中。內(nèi)存的調(diào)整主要是指調(diào)整組成SGA的內(nèi)存結(jié)構(gòu)的大小來提高系統(tǒng)性能,由于Oracle數(shù)據(jù)庫服務(wù)器的內(nèi)存結(jié)構(gòu)需求與應(yīng)用密切相關(guān),所以內(nèi)存結(jié)構(gòu)的調(diào)整應(yīng)在磁盤I/O調(diào)整之前進行。 \x0d\x0a1.2.1、庫緩沖區(qū)的調(diào)整 \x0d\x0a庫緩沖區(qū)中包含私用和共享SQL和PL/SQL區(qū),通過比較庫緩沖區(qū)的命中率決定它的大小。要調(diào)整庫緩沖區(qū),必須首先了解該庫緩沖區(qū)的活動情況,庫緩沖區(qū)的活動統(tǒng)計信息保留在動態(tài)性能表v$librarycache數(shù)據(jù)字典中,可通過查詢該表來了解其活動情況,以決定如何調(diào)整。 \x0d\x0a \x0d\x0aSelect sum(pins),sum(reloads) from v$librarycache; \x0d\x0a \x0d\x0aPins列給出SQL語句,PL/SQL塊及被訪問對象定義的總次數(shù);Reloads列給出SQL 和PL/SQL塊的隱式分析或?qū)ο蠖x重裝載時在庫程序緩沖區(qū)中發(fā)生的錯誤。如果sum(pins)/sum(reloads) ≈0,則庫緩沖區(qū)的命中率合適;若sum(pins)/sum(reloads)1, 則需調(diào)整初始化參數(shù) shared_pool_size來重新調(diào)整分配給共享池的內(nèi)存量。 \x0d\x0a1.2.2、數(shù)據(jù)字典緩沖區(qū)的調(diào)整 \x0d\x0a數(shù)據(jù)字典緩沖區(qū)包含了有關(guān)數(shù)據(jù)庫的結(jié)構(gòu)、用戶、實體信息。數(shù)據(jù)字典的命中率,對系統(tǒng)性能影響極大。數(shù)據(jù)字典緩沖區(qū)的使用情況記錄在動態(tài)性能表v$librarycache中,可通過查詢該表來了解其活動情況,以決定如何調(diào)整。 \x0d\x0a \x0d\x0aSelect sum(gets),sum(getmisses) from v$rowcache; \x0d\x0a \x0d\x0aGets列是對相應(yīng)項請求次數(shù)的統(tǒng)計;Getmisses 列是引起緩沖區(qū)出錯的數(shù)據(jù)的請求次數(shù)。對于頻繁訪問的數(shù)據(jù)字典緩沖區(qū),sum(getmisses)/sum(gets)10%~15%。若大于此百分數(shù),則應(yīng)考慮增加數(shù)據(jù)字典緩沖區(qū)的容量,即需調(diào)整初始化參數(shù)shared_pool_size來重新調(diào)整分配給共享池的內(nèi)存量。 \x0d\x0a1.2.3、緩沖區(qū)高速緩存的調(diào)整 \x0d\x0a用戶進程所存取的所有數(shù)據(jù)都是經(jīng)過緩沖區(qū)高速緩存來存取,所以該部分的命中率,對性能至關(guān)重要。緩沖區(qū)高速緩存的使用情況記錄在動態(tài)性能表v$sysstat中,可通過查詢該表來了解其活動情況,以決定如何調(diào)整。 \x0d\x0a \x0d\x0aSelect name,value from v$sysstat where name in ('dbblock gets','consistent gets','physical reads'); \x0d\x0a \x0d\x0adbblock gets和consistent gets的值是請求數(shù)據(jù)緩沖區(qū)中讀的總次數(shù)。physical reads的值是請求數(shù)據(jù)時引起從盤中讀文件的次數(shù)。從緩沖區(qū)高速緩存中讀的可能性的高低稱為緩沖區(qū)的命中率,計算公式: \x0d\x0a \x0d\x0aHit Ratio=1-(physical reds/(dbblock gets+consistent gets)) \x0d\x0a \x0d\x0a如果Hit Ratio60%~70%,則應(yīng)增大db_block_buffers的參數(shù)值。db_block_buffers可以調(diào)整分配給緩沖區(qū)高速緩存的內(nèi)存量,即db_block_buffers可設(shè)置分配緩沖區(qū)高速緩存的數(shù)據(jù)塊的個數(shù)。緩沖區(qū)高速緩存的總字節(jié)數(shù)=db_block_buffers的值*db_block_size的值。db_block_size 的值表示數(shù)據(jù)塊大小的字節(jié)數(shù),可查詢 v$parameter 表: \x0d\x0a \x0d\x0aselect name,value from v$parameter where name='db_block_size'; \x0d\x0a \x0d\x0a在修改了上述數(shù)據(jù)庫的初始化參數(shù)以后,必須先關(guān)閉數(shù)據(jù)庫,在重新啟動數(shù)據(jù)庫后才能使新的設(shè)置起作用。

創(chuàng)新互聯(lián)專注于企業(yè)全網(wǎng)整合營銷推廣、網(wǎng)站重做改版、東遼網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、成都h5網(wǎng)站建設(shè)購物商城網(wǎng)站建設(shè)、集團公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)公司、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為東遼等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

Oracle等數(shù)據(jù)庫數(shù)據(jù)量特別大的時候怎樣從程序和SQL語句方面優(yōu)化使查詢速度加快

一般最常用的大數(shù)據(jù)量優(yōu)化:

1、創(chuàng)建分區(qū)表,使查詢時的大表盡量分割成小表。Oracle提供范圍分區(qū)、列表分區(qū)、Hash分區(qū)以及復(fù)合分區(qū),具體選擇哪種分區(qū)最優(yōu),需要根據(jù)你的業(yè)務(wù)數(shù)據(jù)來確定。

2、創(chuàng)建索引,創(chuàng)建合適的索引可以大大提高查詢速度。但是你的這張大表如果會頻繁的進行update、insert等操作,索引會導(dǎo)致這些操作變慢。就有可能需要進行動態(tài)索引的使用。

3、優(yōu)化復(fù)雜SQL;對復(fù)雜的SQL進行合理的優(yōu)化,這個有時候也需要根據(jù)你的數(shù)據(jù)情況來優(yōu)化,可以參考一些SQL語句優(yōu)化方面的文檔。

如何提高oracle 插入效率

Oracle 數(shù)據(jù)導(dǎo)入方法比較 每個數(shù)據(jù)庫管理員都會面臨數(shù)據(jù)導(dǎo)入的問題,這有可能發(fā)生在數(shù)據(jù)庫的新老移植過程中,或者是在數(shù)據(jù)庫崩潰后的恢復(fù)重建過程中,還有可能是在創(chuàng)建測試數(shù)據(jù)庫的模擬環(huán)境過程中,總之作為一名合格的數(shù)據(jù)庫管理員,你應(yīng)該做好接受各種數(shù)據(jù)導(dǎo)入請求的技術(shù)儲備,同時還要盡量滿足人本能的對導(dǎo)入速度的苛求。本文僅針對 Oracle 數(shù)據(jù)庫所提供的加速數(shù)據(jù)導(dǎo)入的各種特性和技術(shù)進行探討,其中的一些方法也可以轉(zhuǎn)化應(yīng)用于其他數(shù)據(jù)庫。以下七種數(shù)據(jù)導(dǎo)入方法哪個最適用需要針對具體情況具體分析,我也附帶列舉了影響導(dǎo)入速度的各種因素供斟酌。為了比較各種數(shù)據(jù)導(dǎo)入方法的效果,我創(chuàng)建了示例表和數(shù)據(jù)集,并用各種方法導(dǎo)入示例數(shù)據(jù)集來計算總體導(dǎo)入時間和導(dǎo)入進程占用 CPU 時間,這里得出的時間僅供參考。需要說明的是,建議你使用 Oracle 9i 企業(yè)版數(shù)據(jù)庫,當然你也可以嘗試使用 Oracle 7.3 以上的標準版數(shù)據(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,投訴,手機三包維修質(zhì)量82302284385,2003-04-18:13:18:59,3352,咨詢,供水熱線的號碼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 VARCHAR2(25)

逐條數(shù)據(jù)插入INSERT

數(shù)據(jù)導(dǎo)入的最簡單方法就是編寫 INSERT 語句,將數(shù)據(jù)逐條插入數(shù)據(jù)庫。這種方法只適合導(dǎo)入少量數(shù)據(jù),如 SQL*Plus 腳本創(chuàng)建某個表的種子數(shù)據(jù)。該方法的最大缺點就是導(dǎo)入速度緩慢,占用了大量的 CPU 處理時間,不適合大批量數(shù)據(jù)的導(dǎo)入;而其主要優(yōu)點就是導(dǎo)入構(gòu)思簡單又有修改完善的彈性,不需要多做其它的準備就可以使用。如果你有很多時間沒法打發(fā),又想折磨一下數(shù)據(jù)庫和 CPU,那這種方法正適合你。:)

為了與其它方法做比較,現(xiàn)將十萬條記錄通過此方法導(dǎo)入到 CALLS 表中,總共消耗 172 秒,其中導(dǎo)入進程占用 CPU 時間為 52 秒。

逐條數(shù)據(jù)插入 INSERT,表暫無索引

為什么上一種方法占用了較多的 CPU 處理時間,關(guān)鍵是 CALLS 表中已創(chuàng)建了索引,當一條數(shù)據(jù)插入到表中時,Oracle 需要判別新數(shù)據(jù)與老數(shù)據(jù)在索引方面是否有沖突,同時要更新表中的所有索引,重復(fù)更新索引會消耗一定的時間。因此提高導(dǎo)入速度的好辦法就是在創(chuàng)建表時先不創(chuàng)建索引或者在導(dǎo)入數(shù)據(jù)之前刪除所有索引,在外部文件數(shù)據(jù)逐條插入到表中后再統(tǒng)一創(chuàng)建表的索引。這樣導(dǎo)入速度會提高,同時創(chuàng)建的索引也很緊湊而有效,這一原則同樣適用于位圖索引(Bitmap Index)。對于主要的和唯一的關(guān)鍵約束(key constraints),可以使之先暫時失效(disabling)或者刪除約束來獲得同樣的效果,當然這些做法會對已經(jīng)存在的表的外鍵約束產(chǎn)生相關(guān)的影響,在刪除前需要通盤斟酌。

需要說明的是,這種方法在表中已存在很多數(shù)據(jù)的情況下不太合適。例如表中已有九千萬條數(shù)據(jù),而此時需要追加插入一千萬條數(shù)據(jù),實際導(dǎo)入數(shù)據(jù)節(jié)省的時間將會被重新創(chuàng)建一億條數(shù)據(jù)的索引所消耗殆盡,這是我們不希望得到的結(jié)果。但是,如果要導(dǎo)入數(shù)據(jù)的表是空的或?qū)氲臄?shù)據(jù)量比已有的數(shù)據(jù)量要大得多,那么導(dǎo)入數(shù)據(jù)節(jié)省的時間將會少量用于重新創(chuàng)建索引,這時該方法才可以考慮使用。

加快索引創(chuàng)建是另一個需要考慮的問題。為了減少索引創(chuàng)建中排序的工作時間,可以在當前會話中增加 SORT_AREA_SIZE 參數(shù)的大小,該參數(shù)允許當前會話在內(nèi)存的索引創(chuàng)建過程中執(zhí)行更多的排序操作。同樣還可以使用 NOLOGGING 關(guān)鍵字來減少因創(chuàng)建索引而生成的 REDO 日志量,NOLOGGING 關(guān)鍵字會對數(shù)據(jù)庫的恢復(fù)和 Standby 備用數(shù)據(jù)庫產(chǎn)生明顯的影響,所以在使用之前要仔細斟酌,到底是速度優(yōu)先還是穩(wěn)定優(yōu)先。

運用這種方法,先刪除 CALLS 表的主鍵和不唯一的索引,然后逐條導(dǎo)入數(shù)據(jù),完成后重新創(chuàng)建索引( 表在導(dǎo)入數(shù)據(jù)前是空的)。該方法總共消耗 130 秒,包括重建索引的時間,其中導(dǎo)入進程占用 CPU 時間為 35秒。

這種方法的優(yōu)點是可以加快導(dǎo)入的速度并使索引更加緊湊有效;缺點是缺乏通用性,當你對表增加新的復(fù)雜的模式元素(索引、外鍵等)時你需要添加代碼、修改導(dǎo)入執(zhí)行程序。另外針對 7*24 在線要求的數(shù)據(jù)庫在線導(dǎo)入操作時,刪除表的索引會對在線用戶的查詢有很大的性能影響,同時也要考慮,主要或唯一的關(guān)鍵約束條件的刪除或失效可能會影響到引用它們的外鍵的使用。

批量插入,表暫無索引

在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ù)操作更有效率,這是因為只需一次解析 SQL 語句,一些數(shù)據(jù)綁訂操作以及程序與數(shù)據(jù)庫之間來回的操作都顯著減少,而且數(shù)據(jù)庫對每一條數(shù)據(jù)的操作都是重復(fù)可知的,這給數(shù)據(jù)庫提供了優(yōu)化執(zhí)行的可能。其優(yōu)點是數(shù)據(jù)導(dǎo)入的總體時間明顯減少,特別是進程占用 CPU 的時間。

需要提醒的是,通過 OCI 接口確實可以執(zhí)行數(shù)據(jù)批量導(dǎo)入操作,但是許多工具和腳本語言卻不支持使用此功能。如果要使用該方法,需要研究你所使用的開發(fā)工具是否支持 OCI 批量操作功能。導(dǎo)入程序需要進行復(fù)雜的編碼并可能存在錯誤的風(fēng)險,缺乏一定的彈性。

運用上述方法,程序?qū)⑼獠繑?shù)據(jù)提取到內(nèi)存中的數(shù)組里,并執(zhí)行批量插入操作(100行/次),保留了表的刪除/重建索引操作,總的導(dǎo)入時間下降到 14 秒,而進程占用 CPU 的時間下降到7秒,可見實際導(dǎo)入數(shù)據(jù)所花費的時間顯著下降了 95%。

CREATE TABLE AS SELECT,使用Oracle9i的External Table

Oracle 9i 的一項新特性就是 External Table,它就象通常的數(shù)據(jù)庫表一樣,擁有字段和數(shù)據(jù)類型約束,并且可以查詢,但是表中的數(shù)據(jù)卻不存儲在數(shù)據(jù)庫中,而是在與數(shù)據(jù)庫相關(guān)聯(lián)的普通外部文件里。當你查詢 External Table 時,Oracle 將解析該文件并返回符合條件的數(shù)據(jù),就象該數(shù)據(jù)存儲在數(shù)據(jù)庫表中一樣。

需要注意的是,你可以在查詢語句中將 External Table 與數(shù)據(jù)庫中其他表進行連接(Join),但是不能給 External Table 加上索引,并且不能插入/更新/刪除數(shù)據(jù),畢竟它不是真正的數(shù)據(jù)庫表。另外,如果與數(shù)據(jù)庫相關(guān)聯(lián)的外部文件被改變或者被刪除,這會影響到 External Table 返回查詢結(jié)果,所以在變動前要先跟數(shù)據(jù)庫打招呼。

這種方法為導(dǎo)入數(shù)據(jù)打開了新的一扇門。你可以很容易的將外部文件與數(shù)據(jù)庫相關(guān)聯(lián),并且在數(shù)據(jù)庫中創(chuàng)建對應(yīng)的 External Table,然后就可以立即查詢數(shù)據(jù),就象外部數(shù)據(jù)已經(jīng)導(dǎo)入到數(shù)據(jù)庫表中一樣。唯一的不足需要明確,數(shù)據(jù)并未真正導(dǎo)入到數(shù)據(jù)庫中,當外部文件被刪除或覆蓋時,數(shù)據(jù)庫將不能訪問 External Table 里的數(shù)據(jù),而且索引沒有被創(chuàng)建,訪問數(shù)據(jù)速度將有所緩慢。創(chuàng)建 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 FIELDS 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, emp_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;

因為 CALLS 表是真正的數(shù)據(jù)庫表,可以創(chuàng)建索引來加快訪問,表中的數(shù)據(jù)將被保留,即使外部數(shù)據(jù)文件被更新或被刪除。在建表語句中NOLOGGING關(guān)鍵字用于加快索引重建。

運用這種方法導(dǎo)入數(shù)據(jù),總的導(dǎo)入時間為 15 秒,進程占用 CPU 的時間為8秒,這比前一種方法稍微慢些,但不能就此認為使用 External Table 導(dǎo)入數(shù)據(jù)一定比 OCI 批量插入慢。

這種方法的優(yōu)點是,未經(jīng)進行大量的編寫代碼就取得了不錯的結(jié)果,不象 OCI 批量插入存在編碼錯誤風(fēng)險,它還可以使用 dbms_job 包調(diào)度數(shù)據(jù)導(dǎo)入進程,實現(xiàn)數(shù)據(jù)導(dǎo)入的自動化。其缺點是目標表必須先刪除后重建,如果只需要導(dǎo)入增量數(shù)據(jù)時此方法就不合適了,另外用戶在表的重建過程中訪問數(shù)據(jù)時會遇到 "table or view does not exist" 的錯誤,它僅適用于 Oracle 9i 以上版本的數(shù)據(jù)庫。

INSERT Append as SELECT,使用 Oracle9i 的 External Table

上一種方法演示了如何創(chuàng)建與外部數(shù)據(jù)文件關(guān)聯(lián)的數(shù)據(jù)庫表,其表的數(shù)據(jù)是由外部數(shù)據(jù)文件映射過來。缺點是數(shù)據(jù)庫表需要被先刪除再重建來保持與外部數(shù)據(jù)文件的一致和同步,對導(dǎo)入增量的數(shù)據(jù)而不需要刪除已有數(shù)據(jù)的情況不合適。針對這種需求,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 FROM calls_external;

該語句讀取引用外部數(shù)據(jù)文件的 CALLS_EXTERNAL 表中內(nèi)容,并將之增加到表 CALLS 中。Append 提示告訴 Oracle 使用快速機制來插入數(shù)據(jù),同時可以配合使用表的 NOLOGGING 關(guān)鍵字。

可以預(yù)見這種方法與前一方法消耗了相同的時間,畢竟它們是使用 External Table 特性導(dǎo)入數(shù)據(jù)的不同階段解決方法。如果目標表不是空的,那將會消耗稍微長的時間(因為要重建更長的索引),而前一 CREATE TABLE as SELECT 方法是整體創(chuàng)建索引。

SQL*Loader的強大功能

SQL*Loader 是 Oracle 提供的導(dǎo)入實用程序,特別針對從外部文件導(dǎo)入大批量數(shù)據(jù)進入數(shù)據(jù)庫表。該工具已經(jīng)有多年的歷史,每一次版本升級都使其更加強大、靈活和快捷,但遺憾的是它的語法卻是神秘而不直觀,并且只能從命令行窗口處進行調(diào)用。

盡管它有不直觀的缺點,但卻是最快最有效的導(dǎo)入數(shù)據(jù)方法。缺省情況下它使用 "conventional path" 常規(guī)選項來批量導(dǎo)入數(shù)據(jù),其性能提高度并不明顯。我建議使用更快速的導(dǎo)入?yún)?shù)選項,在命令行添加"direct=true" 選項調(diào)用 "direct path" 導(dǎo)入選項。在 "direct path" 導(dǎo)入實現(xiàn)中,程序在數(shù)據(jù)庫表的新數(shù)據(jù)塊的 high water mark 處直接寫入導(dǎo)入數(shù)據(jù),縮短了數(shù)據(jù)插入的處理時間,同時優(yōu)化使用了非常有效的B+二叉樹方法來更新表的索引。

運用這種方法,如果使用缺省的 conventional path 導(dǎo)入選項,總的導(dǎo)入時間是 81 秒,進程占用 CPU 時間大約是 12 秒,這包括了更新表的索引時間。如果使用 direct path 導(dǎo)入選項,總的導(dǎo)入時間竟是 9 秒,進程占用 CPU 時間也僅僅是 3 秒,也包括了更新表的索引時間。

由此可見,盡管表中的索引在數(shù)據(jù)導(dǎo)入之前并沒有被刪除,使用SQL*Loader的direct path 導(dǎo)入選項仍然是快速和有效的。當然它也有缺點,就像NOLOGGING關(guān)鍵字一樣該方法不生成REDO日志數(shù)據(jù),導(dǎo)入進程出錯后將無法恢復(fù)到先前狀態(tài);在數(shù)據(jù)導(dǎo)入過程中表的索引是不起作用的,用戶此時訪問該表時將出現(xiàn)遲緩,當然在數(shù)據(jù)導(dǎo)入的過程中最好不要讓用戶訪問表。

分區(qū)交換 (Partition Exchange)

以上討論的數(shù)據(jù)導(dǎo)入方法都有一個限制,就是要求用戶在導(dǎo)入數(shù)據(jù)完成之后才可以訪問數(shù)據(jù)庫表。面對7×24不間斷訪問數(shù)據(jù)庫來說,如果我們只是導(dǎo)入需要增加的數(shù)據(jù)時,這種限制將對用戶的實時訪問產(chǎn)生影響。Oracle在這方面提供了表分區(qū)功能,它可以減少導(dǎo)入數(shù)據(jù)操作對用戶實時訪問數(shù)據(jù)的影響,操作模式就象使用可熱插拔的硬盤一樣,只不過這里的硬盤換成了分區(qū)(Partition)而已。需要聲明的是 Partitioning 分區(qū)功能只有在企業(yè)版數(shù)據(jù)庫中才提供。

在一個被分區(qū)過的表中,呈現(xiàn)給用戶的表是多個分區(qū)段(segments)的集合。分區(qū)可以在需要時被添加,在維護時被卸載或刪除,分區(qū)表可以和數(shù)據(jù)庫中的表交換數(shù)據(jù),只要它們的表結(jié)構(gòu)和字段類型是一致的,交換后的分區(qū)表將擁有與之互動的表的數(shù)據(jù)。需要注意的是,這種交換只是在Oracle數(shù)據(jù)庫的數(shù)據(jù)字典層面上進行,并沒有數(shù)據(jù)被實際移動,所以分區(qū)表交換是極其快速的。

為了創(chuàng)建實驗環(huán)境,先假設(shè)CALLS表是個分區(qū)表,要創(chuàng)建一個空的分區(qū)PART_01012004,用來保存2004年1月1日的呼叫數(shù)據(jù)。然后需要再創(chuàng)建一臨時表為CALLS_TEMP,該表與CALLS表擁有相同的字段和數(shù)據(jù)類型。

我們使用先前介紹的導(dǎo)入方法將十萬條數(shù)據(jù)導(dǎo)入到CALLS_TEMP表中,可以耐心等待數(shù)據(jù)完全導(dǎo)入到CALLS_TEMP表中,并且創(chuàng)建好索引和相關(guān)約束條件,所有這一切操作并不影響用戶實時訪問CALLS表,因為我們只對CALLS_TEMP臨時表進行了操作。一旦數(shù)據(jù)導(dǎo)入完成,CALLS_TEMP表就存有2004年1月1日的呼叫數(shù)據(jù)。同時利用CALLS表中名為PART_01012004的空分區(qū),使用如下語句執(zhí)行分區(qū)交換:

ALTER TABLE calls EXCHANGE PARTITION part_01012004 WITH TABLE calls_temp INCLUDING INDEXES WITHOUT VALIDATION;

分區(qū)交換操作將非常快速地只更新CALLS表的數(shù)據(jù)字典,PART_01012004分區(qū)表即刻擁有CALLS_TEMP表的所有數(shù)據(jù),而CALLS_TEMP表變?yōu)榭毡怼<俣–ALLS表使用局部索引而非全局索引,上述語句中的INCLUDING INDEXES將保證分區(qū)交換包括索引的可用性,WITHOUT VALIDATION 指明不檢查交替表中數(shù)據(jù)的匹配,加快了交換的速度。

結(jié)論

以上探討了Oracle數(shù)據(jù)庫的多種數(shù)據(jù)導(dǎo)入方法,每種方法都有其優(yōu)缺點和適用環(huán)境,能夠滿足你不同的導(dǎo)入需求,當然你需要在了解了這些方法后,在速度、簡易性、靈活性、可恢復(fù)性和數(shù)據(jù)可用性之間尋求最佳導(dǎo)入方案。

為了對比各種方法的效果,我們創(chuàng)建了一個實例來展示各種方法的導(dǎo)入效率和效果,從中你可以選擇最適合的方法用于今后的數(shù)據(jù)導(dǎo)入工作。同時請記住,本文并未囊括所有的ORACLE數(shù)據(jù)導(dǎo)入技術(shù)(比如并行數(shù)據(jù)導(dǎo)入技術(shù)),這需要我們繼續(xù)不懈的探索和嘗試。

如何提高oracle的查詢速度

幾個簡單的步驟大幅提高Oracle性能--我優(yōu)化數(shù)據(jù)庫的三板斧。

數(shù)據(jù)庫優(yōu)化的討論可以說是一個永恒的主題。資深的Oracle優(yōu)化人員通常會要求提出性能問題的人對數(shù)據(jù)庫做一個statspack,貼出數(shù)據(jù)庫配置等等。還有的人認為要抓出執(zhí)行最慢的語句來進行優(yōu)化。但實際情況是,提出疑問的人很可能根本不懂執(zhí)行計劃,更不要說statspack了。而我認為,數(shù)據(jù)庫優(yōu)化,應(yīng)該首先從大的方面考慮:網(wǎng)絡(luò)、服務(wù)器硬件配置、操作系統(tǒng)配置、Oracle服務(wù)器配置、數(shù)據(jù)結(jié)構(gòu)組織、然后才是具體的調(diào)整。實際上網(wǎng)絡(luò)、硬件等往往無法決定更換,應(yīng)用程序一般也無法修改,因此應(yīng)該著重從數(shù)據(jù)庫配置、數(shù)據(jù)結(jié)構(gòu)上來下手,首先讓數(shù)據(jù)庫有一個良好的配置,然后再考慮具體優(yōu)化某些過慢的語句。我在給我的用戶系統(tǒng)進行優(yōu)化的過程中,總結(jié)了一些基本的,簡單易行的辦法來優(yōu)化數(shù)據(jù)庫,算是我的三板斧,呵呵。不過請注意,這些不一定普遍使用,甚至有的會有副作用,但是對OLTP系統(tǒng)、基于成本的數(shù)據(jù)庫往往行之有效,不妨試試。(注:附件是Burleson寫的用來報告數(shù)據(jù)庫性能等信息的腳本,本文用到)

一.設(shè)置合適的SGA

常常有人抱怨服務(wù)器硬件很好,但是Oracle就是很慢。很可能是內(nèi)存分配不合理造成的。(1)假設(shè)內(nèi)存有512M,這通常是小型應(yīng)用。建議Oracle的SGA大約240M,其中:共享池(SHARED_POOL_SIZE)可以設(shè)置60M到80M,根據(jù)實際的用戶數(shù)、查詢等來定。數(shù)據(jù)塊緩沖區(qū)可以大致分配120M-150M,8i下需要設(shè)置DB_BLOCK_BUFFERS,DB_BLOCK_BUFFER*DB_BLOCK_SIZE等于數(shù)據(jù)塊緩沖區(qū)大小。9i 下的數(shù)據(jù)緩沖區(qū)可以用db_cache_size來直接分配。

(2)假設(shè)內(nèi)存有1G,Oracle 的SGA可以考慮分配500M:共享池分配100M到150M,數(shù)據(jù)緩沖區(qū)分配300M到400M。

(3)內(nèi)存2G,SGA可以考慮分配1.2G,共享池300M到500M,剩下的給數(shù)據(jù)塊緩沖區(qū)。

(4)內(nèi)存2G以上:共享池300M到500M就足夠啦,再多也沒有太大幫助;(Biti_rainy有專述)數(shù)據(jù)緩沖區(qū)是盡可能的大,但是一定要注意兩個問題:一是要給操作系統(tǒng)和其他應(yīng)用留夠內(nèi)存,二是對于32位的操作系統(tǒng),Oracle的SGA有1.75G的限制。有的32位操作系統(tǒng)上可以突破這個限制,方法還請看Biti的大作吧。

二.分析表和索引,更改優(yōu)化模式

Oracle默認優(yōu)化模式是CHOOSE,在這種情況下,如果表沒有經(jīng)過分析,經(jīng)常導(dǎo)致查詢使用全表掃描,而不使用索引。這通常導(dǎo)致磁盤I/O太多,而導(dǎo)致查詢很慢。如果沒有使用執(zhí)行計劃穩(wěn)定性,則應(yīng)該把表和索引都分析一下,這樣可能直接會使查詢速度大幅提升。分析表命令可以用ANALYZE TABLE 分析索引可以用ANALYZE INDEX命令。對于少于100萬的表,可以考慮分析整個表,對于很大的表,可以按百分比來分析,但是百分比不能過低,否則生成的統(tǒng)計信息可能不準確。可以通過DBA_TABLES的LAST_ANALYZED列來查看表是否經(jīng)過分析或分析時間,索引可以通過DBA_INDEXES的LAST_ANALYZED列。

下面通過例子來說明分析前后的速度對比。(表CASE_GA_AJZLZ大約有35萬數(shù)據(jù),有主鍵)首先在SQLPLUS中打開自動查詢執(zhí)行計劃功能。(第一次要執(zhí)行\(zhòng)RDBMS\ADMIN\utlxplan.sql來創(chuàng)建PLAN_TABLE這個表)

SQL SET AUTOTRACE ON

SQLSET TIMING ON

通過SET AUTOTRACE ON 來查看語句的執(zhí)行計劃,通過SET TIMING ON 來查看語句運行時間。

SQL seleCT count(*) from CASE_GA_AJZLZ;

COUNT(*)

----------

346639

已用時間: 00: 00: 21.38

Execution Plan

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 SORT (AGGREGATE)

2 1 TABLE ACCESS (FULL) OF 'CASE_GA_AJZLZ'

……………………

請注意上面分析中的TABLE ACCESS(FULL),這說明該語句執(zhí)行了全表掃描。而且查詢使用了21.38秒。這時表還沒有經(jīng)過分析。下面我們來對該表進行分析:

SQL analyze table CASE_GA_AJZLZ compute statistics;

表已分析。已用時間: 00: 05: 357.63。然后再來查詢:

SQL select count(*) from CASE_GA_AJZLZ;

COUNT(*)

----------

346639

已用時間: 00: 00: 00.71

Execution Plan

0 SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=351 Card=1)

1 0 SORT (AGGREGATE)

2 1 INDEX (FAST FULL SCAN) OF 'PK_AJZLZ' (UNIQUE) (Cost=351

Card=346351)

…………………………

請注意,這次時間僅僅用了0.71秒!這要歸功于INDEX(FAST FULL SCAN)。通過分析表,查詢使用了PK_AJZLZ索引,磁盤I/O大幅減少,速度也大幅提升!下面的實用語句可以用來生成分析某個用戶的所有表和索引,假設(shè)用戶是GAXZUSR:

SQL set pagesize 0

SQL spool d:\analyze_tables.sql;

SQL select 'analyze table '||owner||'.'||table_name||'

compute statistics;' from dba_tables where owner='GAXZUSR';

SQL spool off

SQL spool spool d:\analyze_indexes.sql;

SQL select 'analyze index '||owner||'.'||index_name||'

compute statistics;' from dba_indexes where owner='GAXZUSR';

SQL spool off

SQL @d:\analyze_tables.sql

SQL @d:\analyze_indexes.sql

解釋:上面的語句生成了兩個sql文件,分別分析全部的GAXZUSR的表和索引。如果需要按照百分比來分析表,可以修改一下腳本。通過上面的步驟,我們就完成了對表和索引的分析,可以測試一下速度的改進啦。建議定期運行上面的語句,尤其是數(shù)據(jù)經(jīng)過大量更新。

當然,也可以通過dbms_stats來分析表和索引,更方便一些。但是我仍然習(xí)慣上面的方法,因為成功與否會直接提示出來。

另外,我們可以將優(yōu)化模式進行修改。optimizer_mode值可以是RULE、CHOOSE、FIRST_ROWS和ALL_ROWS。對于OLTP系統(tǒng),可以改成FIRST_ROWS,來要求查詢盡快返回結(jié)果。這樣即使不用分析,在一般情況下也可以提高查詢性能。但是表和索引經(jīng)過分析后有助于找到最合適的執(zhí)行計劃。

三.設(shè)置cursor_sharing=FORCE 或SIMILAR

這種方法是8i才開始有的,oracle805不支持。通過設(shè)置該參數(shù),可以強制共享只有文字不同的語句解釋計劃。例如下面兩條語句可以共享:

SQL SELECT * FROM MYTABLE WHERE NAME='tom'

SQL SELECT * FROM MYTABLE WHERE NAME='turner'

這個方法可以大幅降低緩沖區(qū)利用率低的問題,避免語句重新解釋。通過這個功能,可以很大程度上解決硬解析帶來的性能下降的問題。個人感覺可根據(jù)系統(tǒng)的實際情況,決定是否將該參數(shù)改成FORCE。該參數(shù)默認是exact。不過一定要注意,修改之前,必須先給ORACLE打補丁,否則改之后oracle會占用100%的CPU,無法使用。對于ORACLE9i,可以設(shè)置成SIMILAR,這個設(shè)置綜合了FORCE和EXACT的優(yōu)點。不過請慎用這個功能,這個參數(shù)也可能帶來很大的負面影響!

四.將常用的小表、索引釘在數(shù)據(jù)緩存KEEP池中

內(nèi)存上數(shù)據(jù)讀取速度遠遠比硬盤中讀取要快,據(jù)稱,內(nèi)存中數(shù)據(jù)讀的速度是硬盤的14000倍!如果資源比較豐富,把常用的小的、而且經(jīng)常進行全表掃描的表給釘內(nèi)存中,當然是在好不過了。可以簡單的通過ALTER TABLE tablename CACHE來實現(xiàn),在ORACLE8i之后可以使用ALTER TABLE table STORAGE(BUFFER_POOL KEEP)。一般來說,可以考慮把200數(shù)據(jù)塊之內(nèi)的表放在keep池中,當然要根據(jù)內(nèi)存大小等因素來定。關(guān)于如何查出那些表或索引符合條件,可以使用本文提供的access.sql和access_report.sql。這兩個腳本是著名的Oracle專家 Burleson寫的,你也可以在讀懂了情況下根據(jù)實際情況調(diào)整一下腳本。對于索引,可以通過ALTER INDEX indexname STORAGE(BUFFER_POOL KEEP)來釘在KEEP池中。

將表定在KEEP池中需要做一些準備工作。對于ORACLE9i 需要設(shè)置DB_KEEP_CACHE_SIZE,對于8i,需要設(shè)置buffer_pool_keep。在8i中,還要修改db_block_lru_latches,該參數(shù)默認是1,無法使用buffer_pool_keep。該參數(shù)應(yīng)該比2*3*CPU數(shù)量少,但是要大于1,才能設(shè)置DB_KEEP_CACHE_BUFFER。buffer_pool_keep從db_block_buffers中分配,因此也要小于db_block_buffers。設(shè)置好這些參數(shù)后,就可以把常用對象永久釘在內(nèi)存里。

五.設(shè)置optimizer_max_permutations

對于多表連接查詢,如果采用基于成本優(yōu)化(CBO),ORACLE會計算出很多種運行方案,從中選擇出最優(yōu)方案。這個參數(shù)就是設(shè)置oracle究竟從多少種方案來選擇最優(yōu)。如果設(shè)置太大,那么計算最優(yōu)方案過程也是時間比較長的。Oracle805和8i默認是80000,8建議改成2000。對于9i,已經(jīng)默認是2000了。

六.調(diào)整排序參數(shù)

(1) SORT_AREA_SIZE:默認的用來排序的SORT_AREA_SIZE大小是32K,通常顯得有點小,一般可以考慮設(shè)置成1M(1048576)。這個參數(shù)不能設(shè)置過大,因為每個連接都要分配同樣的排序內(nèi)存。

(2) SORT_MULTIBLOCK_READ_COUNT:增大這個參數(shù)可以提高臨時表空間排序性能,該參數(shù)默認是2,可以改成32來對比一下排序查詢時間變化。注意,這個參數(shù)的最大值與平臺有關(guān)系。

請問在Oracle中如何加速跨庫查詢?

第一就是優(yōu)化網(wǎng)絡(luò),如果網(wǎng)絡(luò)沒問題那就沒有別的辦法,只能從查詢語句上優(yōu)化。

因為你胯庫查詢時間消耗=在其他庫上面執(zhí)行查詢的時間+網(wǎng)絡(luò)傳輸時間。通常網(wǎng)絡(luò)不會有問題,所以只能優(yōu)化查詢語句

分享名稱:oracle如何加速數(shù)據(jù),oracle查詢速度優(yōu)化
瀏覽地址:http://chinadenli.net/article7/dsgegij.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站網(wǎng)站策劃定制開發(fā)云服務(wù)器全網(wǎng)營銷推廣品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護公司