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

如何加速oracle數據 oracle加快查詢速度

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

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

法庫網站制作公司哪家好,找創(chuàng)新互聯公司!從網頁設計、網站建設、微信開發(fā)、APP開發(fā)、響應式網站建設等網站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯公司自2013年創(chuàng)立以來到現在10年的時間,我們擁有了豐富的建站經驗和運維經驗,來保證我們的工作的順利進行。專注于網站建設就選創(chuàng)新互聯公司

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

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

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

如何提高oracle 插入效率

Oracle 數據導入方法比較 每個數據庫管理員都會面臨數據導入的問題,這有可能發(fā)生在數據庫的新老移植過程中,或者是在數據庫崩潰后的恢復重建過程中,還有可能是在創(chuàng)建測試數據庫的模擬環(huán)境過程中,總之作為一名合格的數據庫管理員,你應該做好接受各種數據導入請求的技術儲備,同時還要盡量滿足人本能的對導入速度的苛求。本文僅針對 Oracle 數據庫所提供的加速數據導入的各種特性和技術進行探討,其中的一些方法也可以轉化應用于其他數據庫。以下七種數據導入方法哪個最適用需要針對具體情況具體分析,我也附帶列舉了影響導入速度的各種因素供斟酌。為了比較各種數據導入方法的效果,我創(chuàng)建了示例表和數據集,并用各種方法導入示例數據集來計算總體導入時間和導入進程占用 CPU 時間,這里得出的時間僅供參考。需要說明的是,建議你使用 Oracle 9i 企業(yè)版數據庫,當然你也可以嘗試使用 Oracle 7.3 以上的標準版數據庫。本文使用的機器配置為:CPU Intel P4,內存 256M,數據庫 Oracle 9i 企業(yè)版

示例表結構和數據集

為了演示和比較各種數據導入方法,我假定數據導入任務是將外部文件數據導入到 Oracle 數據庫的CALLS表中,外部數據文件包含十萬條呼叫中心記錄,將近 6MB 的文件大小,具體的數據示例如下:

82302284384,2003-04-18:13:18:58,5001,投訴,手機三包維修質量82302284385,2003-04-18:13:18:59,3352,咨詢,供水熱線的號碼82302284386,2003-04-18:13:19:01,3142,建議,增設公交線路

接受導入數據的表名是 CALLS,表結構如下:

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)

逐條數據插入INSERT

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

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

逐條數據插入 INSERT,表暫無索引

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

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

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

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

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

批量插入,表暫無索引

在Oracle V6 中 OCI 編程接口加入了數組接口特性。數組操作允許導入程序讀取外部文件數據并解析后,向數據庫提交SQL語句,批量插入 SQL 語句檢索出的數據。Oracle 僅需要執(zhí)行一次 SQL 語句,然后在內存中批量解析提供的數據。批量導入操作比逐行插入重復操作更有效率,這是因為只需一次解析 SQL 語句,一些數據綁訂操作以及程序與數據庫之間來回的操作都顯著減少,而且數據庫對每一條數據的操作都是重復可知的,這給數據庫提供了優(yōu)化執(zhí)行的可能。其優(yōu)點是數據導入的總體時間明顯減少,特別是進程占用 CPU 的時間。

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

運用上述方法,程序將外部數據提取到內存中的數組里,并執(zhí)行批量插入操作(100行/次),保留了表的刪除/重建索引操作,總的導入時間下降到 14 秒,而進程占用 CPU 的時間下降到7秒,可見實際導入數據所花費的時間顯著下降了 95%。

CREATE TABLE AS SELECT,使用Oracle9i的External Table

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

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

這種方法為導入數據打開了新的一扇門。你可以很容易的將外部文件與數據庫相關聯,并且在數據庫中創(chuàng)建對應的 External Table,然后就可以立即查詢數據,就象外部數據已經導入到數據庫表中一樣。唯一的不足需要明確,數據并未真正導入到數據庫中,當外部文件被刪除或覆蓋時,數據庫將不能訪問 External Table 里的數據,而且索引沒有被創(chuàng)建,訪問數據速度將有所緩慢。創(chuàng)建 CALLS_EXTERNAL(External Table表)如下,使之與外部數據文件關聯:

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 關聯同步,刪除 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 表是真正的數據庫表,可以創(chuàng)建索引來加快訪問,表中的數據將被保留,即使外部數據文件被更新或被刪除。在建表語句中NOLOGGING關鍵字用于加快索引重建。

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

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

INSERT Append as SELECT,使用 Oracle9i 的 External Table

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

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

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

SQL*Loader的強大功能

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

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

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

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

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

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

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

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

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

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

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

結論

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

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

如何提高Oracle數據庫的檢索速度

設置合適的SGA 分析表和索引,更改優(yōu)化模式 ;

設置cursor_sharing=FORCE 或SIMILAR ;

將常用的小表、索引釘在數據緩存KEEP池中 ,

設置optimizer_max_permutations ,調整排序參數 。

oracle視圖是一個虛擬表,視圖并不在數據庫中存儲數據值,數據庫中只在數據字典中存儲對視圖的定義。

oracle 數據庫很慢,應該如何優(yōu)化

1、是這樣的。

2、這個說不好,我沒這么做過。你手邊應該有oralce的全套電子文檔吧。關鍵是你要找對系統(tǒng)表或者視圖。我記得索引的系統(tǒng)視圖不是這個。

3、這些與你要做的有關系嗎?別像沒頭蒼蠅一樣瞎撞了。

4、不用刪表,如果你連基本的語句命令都不懂,那只能看書了。

5、慢的原因有好多,逐步排除吧,等找到真正原因再說。急沒用的。

6、默認情況下,是會建到用戶的默認表空間的。

7、這個看你的維護需要。最起碼先弄明白你的庫是怎么回事再說吧。就從這些問題看,你根本就是門外漢,連庫是怎么回事都沒弄明白。

如何加速Oracle大批量數據處理?

一、 提高DML操作的辦法:\x0d\x0a簡單說來:\x0d\x0a1、暫停索引,更新后恢復.避免在更新的過程中涉及到索引的重建.\x0d\x0a2、批量更新,每更新一些記錄后及時進行提交動作.避免大量占用回滾段和或臨時表空間.\x0d\x0a3、創(chuàng)建一臨時的大的表空間用來應對這些更新動作.\x0d\x0a\x0d\x0a4、批量更新,每更新一些記錄后及時進行提交動作.避免大量占用回滾段和或臨時表空間.\x0d\x0a\x0d\x0a5、創(chuà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的是索引字段,就會涉及到索引的重建,暫停索引不會提高多少的速度,反而有可能降低UPDATE速度,\x0d\x0a因為在更新是索引可以提高數據的查詢速度,重建索引引起的速度降低影響不大。\x0d\x0a\x0d\x0aORACLE優(yōu)化修改參數最多也只能把性能提高15%,大部分都是SQL語句的優(yōu)化!\x0d\x0a\x0d\x0aupdate總體來說比insert要慢 :\x0d\x0a幾點建議: \x0d\x0a 1、如果更新的數據量接近整個表,就不應該使用index而應該采用全表掃描 \x0d\x0a 2、減少不必要的index,因為update表通常需要update index \x0d\x0a 3、如果你的服務器有多個cpu,采用parellel hint,可以大幅度的提高效率\x0d\x0a 另外,建表的參數非常重要,對于更新非常頻繁的表,建議加大PCTFREE的值,以保證數據塊中有足夠的空間用于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 為了提高速度可以使用下面方法,來減少插入過程中產生的日志:\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為了提高速度可以使用下面方法,來減少插入過程中產生的日志,并且可以制定并行度:\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 為了提高速度可以使用下面方法,來減少插入過程中產生的日志:\x0d\x0a alter table t1 nologging;\x0d\x0a insert /*+append*/ into t1 select * from t;\x0d\x0a \x0d\x0a Direct-Path插入特點:\x0d\x0a1、 append只在insert ? select ?中起作用,像insert /*+ append */ into t values(?)這類的語句是不起作用的。在update、delete操作中,append也不起作用。\x0d\x0a2、 Direct-Path會使數據庫不記錄直接路徑導入的數據的重做日志,會對恢復帶來麻煩。\x0d\x0a3、 Direct-Path直接在表段的高水位線以上的空白數據塊中寫數據,不會重用高水位線以下的空間,會對空間的使用造成一定的浪費,對查詢的性能也會造成一定的影響。而常規(guī)插入會優(yōu)先考慮使用高水位線之下有空閑空間存在的數據塊。因此理論上Direct-Path插入會比常規(guī)插入速度更快,因為Direct-Path直接使用新數據塊,而常規(guī)插入要遍歷freelist獲取可用空閑數據塊,如果同 nologging 配合,這種速度優(yōu)勢會更加明顯。\x0d\x0a4、 以append方式插入記錄后,要執(zhí)行commit,才能對表進行查詢。否則會出現錯誤:ORA-12838: 無法在并行模式下修改之后讀/修改對象。\x0d\x0a5、 用append導入數據后,如果沒有提交或者回滾,在其他會話中任何對該表的DML都會被阻塞(不會報錯),但對該表的查詢可以正常執(zhí)行。\x0d\x0a6、 在歸檔模式下,要把表設置為nologging,然后以append方式批量添加記錄,才會顯著減少redo數量。在非歸檔模式下,不必設置表的 nologging屬性,即可減少redo數量。如果表上有索引,則append方式批量添加記錄,不會減少索引上產生的redo數量,索引上的redo 數量可能比表的redo數量還要大。\x0d\x0a7、 數據直接插入數據文件,繞過buffer cache并且忽略了引用完整性約束。\x0d\x0a8、 不管表是否在nologging 下,只要是 direct insert,就不會對數據內容生成undo。\x0d\x0a9、 Oracle在Direct-Path INSERT 操作末尾,對具有索引的表執(zhí)行索引維護,這樣就避免了在drop掉索引后,再rebuild。\x0d\x0a10、 Direct-Path INSERT比常規(guī)的插入需要更多的空間。因為它將數據插入在高水位之上。并行插入非分區(qū)表需要更多的空間,因為它需要為每一個并行線程創(chuàng)建臨時段。\x0d\x0a11、 在插入期間,數據庫在表上獲得排他鎖,用戶不能在表上執(zhí)行并行插入、更新或者刪除操作,并行的索引創(chuàng)建和build也不被允許。但卻可以并行查詢,但查詢返回的是插入之前的結果集。\x0d\x0a (5)、并行DML:\x0d\x0a 如果你的服務器有多個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 為了提高速度可以使用下面方法,來減少插入過程中產生的日志:\x0d\x0a\x0d\x0a INSERT /*+ PARALLEL(tableA, 2) */INTO tableA NOLOGGING\x0d\x0a SELECT * FROM tableB;\x0d\x0a\x0d\x0aoracle默認并不會打開PDML,對DML語句必須手工啟用。即需要執(zhí)行\(zhòng)x0d\x0aalter table enable parallel dml命令。\x0d\x0a \x0d\x0a并行DML特點:\x0d\x0a1、在并行DML模式中,默認的就是DIRECT-PATH插入,為了運行并行DML模式,必須滿足以下條件:\x0d\x0aa、必須是Oracle企業(yè)版;\x0d\x0ab、必須在session中使并行DML生效,執(zhí)行以下sql語句:\x0d\x0aALTER SESSION { ENABLE | FORCE } PARALLEL DML;\x0d\x0ac、必須指定table的并行屬性,在創(chuàng)建的時候或者其他時候,或者在insert操作時使用“PARALLEL”提示。\x0d\x0ad、為了使Direct-Path Insert模式失效,在INSERT語句中指定“NOAPPEND”提示,覆蓋并行DML模式。\x0d\x0a 2、并行Direct-Path INSERT到分區(qū)表:\x0d\x0a 類似于serial Direct-Path INSERT,每個并行操作分配給一個或者多個分區(qū),每個并行操作插入數據到各自的分區(qū)段的高水位標志之上,commit之后,用戶就能看到更新的數據。\x0d\x0a 3、并行Direct-Path INSERT到非分區(qū)表:\x0d\x0a 每個并行執(zhí)行分配一個新的臨時段,并插入數據到臨時段。當commit運行后,并行執(zhí)行協調者合并新的臨時段到主表段,用戶就能看到更新的數據。\x0d\x0a 4、Direct-Path INSERT可以使用Log或者不使用Log。\x0d\x0a 5、另外不得不說的是,并行不是一個可擴展的特性,只有在數據倉庫或作為DBA等少數人的工具在批量數據操作時利于充分利用資源,而在OLTP環(huán)境下使用并行需要非常謹慎。事實上PDML還是有比較多的限制的,例如不支持觸發(fā)器,引用約束,高級復制和分布式事務等特性,同時也會帶來額外的空間占用,PDDL同 樣是如此。

oracle數據庫的性能優(yōu)化有哪些方法?

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

本文名稱:如何加速oracle數據 oracle加快查詢速度
文章URL:http://chinadenli.net/article46/hpjseg.html

成都網站建設公司_創(chuàng)新互聯,為您提供網站收錄做網站靜態(tài)網站外貿建站虛擬主機微信小程序

廣告

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

微信小程序開發(fā)