壹、SGA

  1、Shared pool tunning

  Shared pool的優化應該放在優先考慮,因為壹個cache miss在shared pool中發生比在data buffer中發生導致的成本更高,由於dictionary數據壹般比library cache中的數據在內存中保存的時間長,所以關鍵是library cache的優化。

  Gets:(parse)在namespace中查找對象的次數;

  Pins:(execution)在namespace中讀取或執行對象的次數;

  Reloads:(reparse)在執行階段library cache misses的次數,導致sql需要重新解析。

  1) 檢查v$librarycache中sql area的gethitratio是否超過90%,如果未超過90%,應該檢查應用代碼,提高應用代碼的效率。

  Select gethitratio from v$librarycache where namespace=’sql area’;

  2) v$librarycache中reloads/pins的比率應該小於1%,如果大於1%,應該增加參數shared_pool_size的值。

  Select sum(pins) “executions”,sum(reloads) “cache misses”,sum(reloads)/sum(pins) from v$librarycache;

  reloads/pins>1%有兩種可能,壹種是library cache空間不足,壹種是sql中引用的對象不合法。

  3)shared pool reserved size壹般是shared pool size的10%,不能超過50%。V$shared_pool_reserved中的request misses=0或沒有持續增長,或者free_memory大於shared pool reserved size的50%,表明shared pool reserved size過大,可以壓縮。

  4)將大的匿名pl/sql代碼塊轉換成小的匿名pl/sql代碼塊調用存儲過程。

  5)從9i開始,可以將execution plan與sql語句壹起保存在library cache中,方便進行性能診斷。從v$sql_plan中可以看到execution plans。

  6)保留大的對象在shared pool中。大的對象是造成內存碎片的主要原因,為了騰出空間許多小對象需要移出內存,從而影響了用戶的性能。因此需要將壹些常用的大的對象保留在shared pool中,下列對象需要保留在shared pool中:

  a. 經常使用的存儲過程;

  b. 經常操作的表上的已編譯的觸發器

  c. Sequence,因為Sequence移出shared pool後可能產生號碼丟失。

  查找沒有保存在library cache中的大對象:

  Select * from v$db_object_cache where sharable_mem>10000 and

  type in (’PACKAGE’,'PROCEDURE’,'FUNCTION’,'PACKAGE BODY’) and kept=’NO’;

  將這些對象保存在library cache中:

  Execute dbms_shared_pool.keep(‘package_name’);

  對應腳本:dbmspool.sql

  7)查找是否存在過大的匿名pl/sql代碼塊。兩種解決方案:

  A.轉換成小的匿名塊調用存儲過程

  B.將其保留在shared pool中

  查找是否存在過大的匿名pl/sql塊:

  Select sql_text from v$sqlarea where command_type=47 and length(sql_text)>500;

  8)Dictionary cache的優化

  避免出現Dictionary cache的misses,或者misses的數量保持穩定,只能通過調整shared_pool_size來間接調整dictionary cache的大小。

  Percent misses應該很低:大部分應該低於2%,合計應該低於15%

  Select sum(getmisses)/sum(gets) from v$rowcache;

  若超過15%,增加shared_pool_size的值。

  2、Buffer Cache

  1)granule大小的設置,db_cache_size以字節為單位定義了default buffer pool的大小。

  如果SGA<128M,granule=4M,否則granule=16M,即需要調整sga的時候以granule為單位增加大小,並且sga的大小應該是granule的整數倍。

  2) 根據v$db_cache_advice調整buffer cache的大小

  SELECT size_for_estimate,buffers_for_estimate,estd_physical_read_factor,estd_physical_reads

  FROM v$db_cache_advice WHERE NAME=’DEFAULT’ AND advice_status=’ON’

  AND block_size=(SELECT Value FROM v$parameter WHERE NAME=’db_block_size’);

  estd_physical_read_factor<=1

  3) 統計buffer cache的cache hit ratio>90%,如果低於90%,可以用下列方案解決:

  ◆增加buffer cache的值;

  ◆使用多個buffer pool;

  ◆Cache table;

  ◆為 sorting and parallel reads 建獨立的buffer cache;

  SELECT NAME,value FROM v$sysstat WHERE NAME IN (’session logical reads’,

  ’physical reads’,'physical reads direct’,'physical reads direct(lob)’);

  Cache hit ratio=1-(physical reads-physical reads direct-physical reads direct (lob))/session logical reads;Select 1-(phy.value-dir.value-lob.value)/log.value from v$sysstat log, v$sysstat phy, v$sysstat dir, v$sysstat LOB where log.name=’session logical reads’ and phy.name=’physical reads’ and dir.name=’physical reads direct’ and lob.name=’physical reads direct (lob)’;

  影響cache hit ratio的因素:全表掃描;應用設計;大表的隨機訪問;cache hits的不均衡分布

  4)表空間使用自動空間管理,消除了自由空間列表的需求,可以減少數據庫的競爭

  3、其他SGA對象

  1)redo log buffer

  對應的參數是log_buffer,缺省值與 OS相關,壹般是500K。檢查v$session_wait中是否存在log buffer wait,v$sysstat中是否存在redo buffer allocation retries

  A、檢查是否存在log buffer wait:

  Select * from v$session_wait where event=’log buffer wait’ ;

  如果出現等待,壹是可以增加log buffer的大小,也可以通過將log 文件移到訪問速度更快的磁盤來解決。

  B、

  Select name,value from v$sysstat where name in

  (‘redo buffer allocation retries’,’redo entries’)

  Redo buffer allocation retries接近0,小於redo entries 的1%,如果壹直在增長,表明進程已經不得不等待redo buffer的空間。如果Redo buffer allocation retries過大,增加log_buffer的值。

  C、檢查日誌文件上是否存在磁盤IO競爭現象

  Select event,total_waits,time_waited,average_wait from v$system_event

  where event like ‘log file switch completion%’;

  如果存在競爭,可以考慮將log文件轉移到獨立的、更快的存儲設備上或增大log文件。

  D、檢查點的設置是否合理

  檢查alert.log文件中,是否存在‘checkpoint not complete’;

  Select event,total_waits,time_waited,average_wait from v$system_event

  where event like ‘log file switch (check%’;

  如果存在等待,調整log_checkpoint_interval、log_checkpoint_timeout的設置。

  E、檢查log archiver的工作

  Select event,total_waits,time_waited,average_wait from v$system_event

  where event like ‘log file switch (arch%’;

  如果存在等待,檢查保存歸檔日誌的存儲設備是否已滿,增加日誌文件組,調整log_archiver_max_processes。

  F、DB_block_checksum=true,因此增加了性能負擔。(為了保證數據的壹致性,oracle的寫數據的時候加壹個checksum在block上,在讀數據的時候對checksum進行驗證)

  2)java pool

  對於大的應用,java_pool_size應>=50M,對於壹般的java存儲過程,缺省的20M已經夠用了。

  3)檢查是否需要調整DBWn

  Select total_waits from v$system_event where event=’free buffer waits’

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

壹.設置合適的SGA

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

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

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

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

二.分析表和索引,更改優化模式

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

下面通過例子來說明分析前後的速度對比。(表CASE_GA_AJZLZ大約有35萬數據,有主鍵)首先在SQLPLUS中打開自動查詢執行計劃功能。(第壹次要執行\RDBMS\ADMIN\utlxplan.sql來創建PLAN_TABLE這個表)
  
  SQL> SET AUTOTRACE ON
  SQL>SET TIMING ON
  
通過SET AUTOTRACE ON 來查看語句的執行計劃,通過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),這說明該語句執行了全表掃描。而且查詢使用了21.38秒。這時表還沒有經過分析。下面我們來對該表進行分析:
  
  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大幅減少,速度也大幅提升!下面的實用語句可以用來生成分析某個用戶的所有表和索引,假設用戶是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的表和索引。如果需要按照百分比來分析表,可以修改壹下腳本。通過上面的步驟,我們就完成了對表和索引的分析,可以測試壹下速度的改進啦。建議定期運行上面的語句,尤其是數據經過大量更新。

當然,也可以通過dbms_stats來分析表和索引,更方便壹些。但是我仍然習慣上面的方法,因為成功與否會直接提示出來。
另外,我們可以將優化模式進行修改。optimizer_mode值可以是RULE、CHOOSE、FIRST_ROWS和ALL_ROWS。對於OLTP系統,可以改成FIRST_ROWS,來要求查詢盡快返回結果。這樣即使不用分析,在壹般情況下也可以提高查詢性能。但是表和索引經過分析後有助於找到最合適的執行計劃。

三.設置cursor_sharing=FORCE 或SIMILAR

這種方法是8i才開始有的,oracle805不支持。通過設置該參數,可以強制共享只有文字不同的語句解釋計劃。例如下面兩條語句可以共享:
  
  SQL> SELECT * FROM MYTABLE WHERE NAME=’tom’
  SQL> SELECT * FROM MYTABLE WHERE NAME=’turner’
  
這個方法可以大幅降低緩沖區利用率低的問題,避免語句重新解釋。通過這個功能,可以很大程度上解決硬解析帶來的性能下降的問題。個人感覺可根據系統的實際情況,決定是否將該參數改成FORCE。該參數默認是exact。不過壹定要註意,修改之前,必須先給ORACLE打補丁,否則改之後oracle會占用100%的CPU,無法使用。對於ORACLE9i,可以設置成SIMILAR,這個設置綜合了FORCE和EXACT的優點。不過請慎用這個功能,這個參數也可能帶來很大的負面影響!

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

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

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

五.設置optimizer_max_permutations

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

六.調整排序參數

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

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

        壹、Test Windos方式

  declare

  maxrecords constant int:=100000;

  i int :=1;

  begin

  for i in 1..maxrecords loop

  insert into test2

  (id, name)

  values

  (test2_seq.nextval, to_char(9999+i));

  end loop;

  dbms_output.put_line(’ 成功錄入數據!’);

  commit;

  end;

  二、從已有表中往入另壹張表導數據

  create or replace procedure TestProc is

  begin

  for c in(select id, name from test2) loop

  insert into test

  (id,

  name)

  values

  (test_seq.nextval, c.name);

  end loop;

  end TestProc;

        Oracle 數據庫使用的時間越長,操作數據庫的人越多,可能會遇到壹些非法數據庫對象引起的錯誤。

例如:

  按用護 exp 時會報錯(oracle10G)

    . exporting synonyms
  EXP-00008: ORACLE error 3113 encountered
  ORA-03113: end-of-file on communication channel
  EXP-00000: Export terminated unsuccessfully
  ORACLE8i 裏面的的exp錯誤 ORA-00980。

  跟蹤文件裏的錯誤:
  ORA-07445: exception encountered:
  core dump [joe_well_known_internal()+39] [SIGSEGV]
  [Address not mapped to object] [0x1268D5C] [] []
  ……
  SELECT SYNNAM, DBMS_JAVA.LONGNAME(SYNNAM),
  DBMS_JAVA.LONGNAME(SYNTAB),TABOWN,
  TABNODE, PUBLIC$, SYNOWN, SYNOWNID, TABOWNID, SYNOBJNO
  FROM SYS.EXU9SYNU ORDER BY SYNTIME;
  我的經驗是這些數據庫的用護下很可能有非法數據庫對象。刪除不合法的數據對象,就可以了。壹般情況下生成當前用護下重編譯非法數據庫對象的SQL語句:
  set pages 500;
  set lines 200;
  set trims on;
  set heading off;
  spool /tmp/1.sql;
  select ‘alter ‘||object_type||’ ‘||object_name||’;
  compile’ from user_objects where status=’INVALID’;
  spool off;
  @/tmp/1.sql;
  但也有例外的情況:

  當原始的表被drop掉後,依據它創建的同義詞就變得不能訪問了。

  原始的表重建以後,同義詞仍然不可以訪問。

    但在user_objects裏面的status狀態是’VALID’,卻不是’INVALID’。

  這需要我們把它們找出來,運行查詢同義詞表結構的語句:
  spool /tmp/1.sql;
  select ‘desc ‘||synonym_name||’;’ from user_synonyms;
  spool off;
  @/tmp/1.sql;
  出錯的同義詞, 壹定要先撤底刪除掉,再重建創建同義詞。
  drop synonym &synonym_name;
  create synonym &synonym_name for &owner.&table_name;
  重編譯後,仍然出錯的數據對象,經開發人員同意後,我們還可以選擇drop它們。我還遇到過壹次在drop非法數據庫對象的時候,不加雙引號之前,提示數據對象不存在。壹定要在數據庫對象加上雙引號就可以刪掉了。(這可能跟創建數據對象所用的輔助性工具有關)

  例如:
  drop table scott.”emp” cascade constraints;
  drop trigger scott.”trigger_name”;
  如果所有的非法數據對象都沒有了,還會出現上面的錯誤。可能是jvm(java虛擬環境)的問題。DBMS_JAVA.LONGNAME()過程函數壹執行,就會報錯。還有壹個解抉辦法:重建sys用護下跟同義詞有關的視圖,讓它找不到記錄。

Oracle非法數據庫對象引起錯誤及解決

  drop view EXU9SYNU;
  create view EXU9SYNU as
  SELECT ”SYNNAM”,”SYNNAM2″,”SYNTAB”,
  ”TABOWN”,”TABNODE”,”PUBLIC$”,”SYNOWN”,
  ”SYNOWNID”,”TABOWNID”,”SYNOBJNO”,”SYNTIME”
  FROM  sys.exu9syn
  – WHERE  synownid = UID; (原來的視圖創建方法)
  WHERE  0=1;
  grant select on sys.EXU9SYNU to public;

  這洋壹來按用護導出數據時,可以跳過同義詞部分,繼續完成後面的工作。

Oracle認證所有考試科目

1Z0-001 9i Internet Application Developer Introduction to Oracle: SQL and PL/SQL
1Z0-007 Introduction to Oracle9i: SQL
1Z0-020 Oracle8l:new features for administrators
1Z0-030 orcacle9i database:new features for administrators
1Z0-031 orcacle9i database:fundamentals i
1Z0-032 orcacle9l database:fundamentals ii
1Z0-033 Oracle9i Database:Performance Tuning
1Z0-035 orcacle9i dba new features for Oracle7.3 and Oracle9 ocps
1Z0-036 Managing Oracle9i on linux
1Z0-040 Oracle database 10g:new features for adminsitrators
1Z0-042 Oracle database 10g:Administration I
1Z0-043 Oracle database 10g:Administration ii
1Z0-045 Oracle database 10g:new features for Oracle8i ocps
1Z0-046 Oracle Database 10g: Managing Oracle on Linux for DBAs
1Z0-047 Oracle Database SQL Expert
1Z0-048 Oracle Database 10g R2: Administering RAC
1Z0-050 Oracle Database 11g: New Features for Administrators
1Z0-051 Oracle Database: SQL Fundamentals I
1Z0-052 Oracle Database 11g: Administrator I : 1z1-052 Exam
1Z0-055 Oracle Database 11g: New Features for 9i OCPs
1Z0-101 Develop pl/sql program units
1Z0-108 Oracle WebLogic System Administration
1Z0-131 9i Internet Application Developer Oracle9i, Build Internet Applications I
1Z0-132 9i Internet Application Developer Oracle9i, Build Internet Applications II
1Z0-140 Oracle9i forms Developer:new features
1Z0-141 Oracle9i forma Developer:build internet applications
1Z0-147 Oracle9i program with pl/sql
1Z0-200 Oracle 11i.E-Business Essentials
1Z0-202 Siebel 8 Consultant Exam
1Z0-204 Oracle EBS R12: E-Business Essentials
1Z0-207 Oracle comm.billing & revenue mgmt:pricing
1Z0-208 Oracle comm.billing & revenue mgmt:server Developer
1Z0-209 Oracle comm.billing & revenue mgmt:System Administrator
1Z0-211 Oracle 11i general ledgerfundamentals
1Z0-212 Oracle payables 11i funfamentats
1Z0-213 Oracle receivables 11i fundamentals
1Z0-221 Oracle 11i inventory management fundamentals
1Z0-222 Oracle Purchasing 11i Fundamentals
1Z0-223 Oracle order management 11i fundamentals
1Z0-226 Oracle EBS R12: Inventory and Order Management Fundamentals
1Z0-231 Oracle implement workflow 11i/2.6
1Z0-232 Oracle 11i system Administration fundamentals
1Z0-233 Oracle 11i install. patch and maintain applications
1Z0-235 Oracle 11i applications DBA:Fundamentals I
1Z0-236 11i Applications DBA Fundamentals II
1Z0-241 PeopleSoft Application Develper I: PeopleTools & PeopleCode
1Z0-242 PeopleSoft Application Developer II: App Engine & Integration
1Z0-255 Hyperion Essbase 7.1.2 Cnsultant
1Z0-257 Hyperion Financial Management 4.1 Consultant
1Z0-259 Hyperion Planning 4.1 Consultant
1Z0-262 Hyperion Planning 4.1 Administrator
1Z0-264 Hyperion Essbase Analytics 9.3 Developer
1Z0-301 Oracle9ias:basic Administration
1Z0-311 Oracle application server 10g:Administration
1Z0-312 Oracle Application Server 10g: Administrator II
1Z0-402 Oracle Enterprise Linux: Fundamentals
1Z0-615 Siebel 7.7 Consultant Core Exam
1Z0-620 Siebel7.7 Analytics App.Developer Professional Core Exam
1Z0-630 Siebel7.7 Analytics Server Architect Professional Core Exam
1Z0-640 Siebel7.7 Analytics DataWarehouse Dev.Prof.Core Exam
1Z1-225 Oracle EBS R12: Inventory and Purchasing Fundamentals
1Z1-226 Oracle EBS R12: Inventory and Order Management Fundamentals
1Z1-238 R12 Oracle: install,Patch and Maintain Oracle Applications
1Z0-273 Hyperion Financial Management 4.1 Administrator I&II
1Z0-225 Oracle EBS R12: Inventory and Purchasing Fundamentals
1Z0-238 R12 Oracle: install,Patch and Maintain Oracle Applications
1Z0-054 Oracle Database 11g: Performance Tuning
1Z1-054 Oracle Database 11g: Performance Tuning
1Z1-051 Oracle Database: SQL Fundamentals I
1Z1-051 Oracle Database: SQL Fundamentals I

如需購買Oracle考古題請到TestPassPort官方網站購買(www.testpassport.net),TestPassPort優惠活動購買上述考題可以享受特殊優惠,購買時輸入testpassport即可享受九五折優惠,購買壹科優惠5% 兩科優惠10% 三科優惠15% 四科優惠20% 五科優惠… 可以累積計算,無時間限制!

在對數據庫進行操作過程中我們可能會碰到這種情況,表中的數據可能重複出現,使我們對數據庫的操作過程中帶來很多的不便,那麼怎麼刪除這些重複沒有用的數據呢?
重複數據刪除技術可以提供更大的備份容量,實現更長時間的數據保留,還能實現備份數據的持續驗證,進步數據恢復服務水平,方便實現數據容災等。重複的數據可能有這樣兩種情況,第一種時表中只有某些字段一樣,第二種是兩行記錄完全一樣。 Oracle數據庫重複數據刪除技術有如下優勢:更大的備份容量、數據能得到持續驗證、有更高的數據恢復服務水平、方便實現備份數據的容災。

一、刪除部分字段重複數據

先來談談如何查詢重複的數據吧。

下面語句可以查詢出那些數據是重複的:

select字段1,字段2,count(*) from表名group by字段1,字段2 having count(*) > 1

將上面的>號改為=號就可以查詢出沒有重複的數據了。

想要刪除這些重複的數據,可以使用下面語句進行刪除

delete from表名a where字段1,字段2 in

(select字段1,字段2,count(*) from表名group by字段1,字段2 having count(*) > 1)

上面的語句非常簡單,就是將查詢到的數據刪除掉。不過這種刪除執行的效率非常低,對於大數據量來說,可能會將數據庫吊死。所以我建議先將查詢到的重複的數據插入到一個暫時表中,然後對進行刪除,這樣,執行刪除的時候就不用再進行一次查詢了。如下:

create TABLE暫時表AS

(select字段1,字段2,count(*) from表名group by字段1,字段2 having count(*) > 1)

上面這句話就是建立了暫時表,並將查詢到的數據插入其中。

下面就可以進行這樣的刪除操作了:

delete from表名a where字段1,字段2 in (select字段1,字段2 from暫時表);

這種先建暫時表再進行刪除的操作要比直接用一條語句進行刪除要高效得多。

這個時候,大家可能會跳出來說,什麼?你叫我們執行這種語句,那不是把所有重複的全都刪除嗎?而我們想保留重複數據中最新的一條記錄啊!大家不要急,下面我就講一下如何進行這種操作。

在oracle中,有個隱藏了自動rowid,裡面給每條記錄一個唯一的rowid,我們假如想保留最新的一條記錄,

我們就可以利用這個字段,保留重複數據中rowid最大的一條記錄就可以了。

下面是查詢重複數據的一個例子:

以下是引用片段:
selecta.rowid,a.*from表名a
wherea.rowid!=
(
selectmax(b.rowid)from表名b
wherea.字段1=b.字段1and
a.字段2=b.字段2
)

下面我就來講解一下,上面括號中的語句是查詢出重複數據中rowid最大的一條記錄。

而外面就是查詢出除了rowid最大之外的其他重複的數據了。

由此,我們要刪除重複數據,只保留最新的一條數據,就可以這樣寫了:

deletefrom表名a
wherea.rowid!=
(
selectmax(b.rowid)from表名b
wherea.字段1=b.字段1and
a.字段2=b.字段2
)

隨便說一下,上面語句的執行效率是很低的,可以考慮建立暫時表,講需要判定重複的字段、rowid插入暫時表中,然後刪除的時候在進行比較。

createtable暫時表as
selecta.字段1,a.字段2,MAX(a.ROWID)dataidfrom正式表aGROUPBYa.字段1,a.字段2;
deletefrom表名a
wherea.rowid!=
(
selectb.dataidfrom暫時表b
wherea.字段1=b.字段1and
a.字段2=b.字段2
);
commit;

二、完全刪除重複記錄

對於表中兩行記錄完全一樣的情況,可以用下面語句獲取到去掉重複數據後的記錄:

select distinct * from表名

可以將查詢的記錄放到暫時表中,然後再將原來的表記錄刪除,最初將暫時表的數據導回原來的表中。如下:

createTABLE暫時表AS(selectdistinct*from表名);
truncatetable正式表;–注:原先由於筆誤寫成了droptable正式表;,現在已經改正過來
insertinto正式表(select*from暫時表);
droptable暫時表;

假如想刪除一個表的重複數據,可以先建一個暫時表,將去掉重複數據後的數據導入到暫時表,然後在從暫時表將數據導入正式表中,如下:

insertINTOt_table_bak
selectdistinct*fromt_table;

三、怎樣快速刪除oracle數據庫

最快的方法就進入註冊表在運行..裡輸入regedit.

依次展開HKEY_LOCAL_MACHINE SOFTWARE

找到ORACLE節點。刪除。

然後刪除ORACLE數據文件,安裝的時候選的路徑。

最初刪除oracle引導文件,在系統盤符的Program Files裡面刪除oracle文件夾。

對參加OCM考試的人員的要求: 

 
主要有兩個要求。一、首先必須是OCP;二、參考人員應參加過Oracle原廠的至少兩門的OCM相關課程的培訓。
 
OCM-參加OCM認證考試需要必備的知識:
 
1、精通Oracle9i的SQL
 
2、RedHat Advanced Server
 
LINUX的一些操作知識,如格式並執行基本的操作系統的命令;創建並遍歷目錄;使用cp,mv及rm來拷貝、移動及刪除文件;linux環境下的文本編輯器的使用;設置環境變量。
 
3、定位和執行Oracle一些應用程序的能力,
 
它包括:RMAN應用程序;Oracle Net Manager;Oracle Net Configuration Assistant;OEM;Listener Utility;OMS;Oracle Password Utility;Database Creation Assistant(DBCA)。
 
4、要熟練使用Oracle Enterprise Manager(OEM)
 
5、熟練使用Oracle Net Manager和Oracle NetConfiguration Assistant來進行網絡配置。
 
6、熟悉Oracle9i(v9.0.1.3)的高級知識
 
7、熟悉使用瀏覽器(netscape)來查閱oracle的幫助文檔。
 
8、熟練使用Konqueror 2.2 browser軟件
 
實踐課考試環境:
 
實踐課的考試在oracle統一專用的教室內進行。由一個oracle的教授來負責監考、佈置場景、收集考試的結果。考生將被隨意指定一個坐位來完成當天的實踐考試。考生不允許使用自帶私人的文檔和筆記,不許與其它的考生商量。移動電話,自帶紙張和PDA都不允許在考試教室內使用。每個考生都將提供一個安裝在redhat Advanced Server 2.1 LINUX環境上的Oracle的server軟件,一個完備的Oracle聯機文檔。

Tags: ,

Oracle提供了多種方法用於減少花在剖析Oracle SQL表達式上的時間,在執行帶有大量執行計劃的複雜查詢時剖析過程會拖累系統的性能。現在我們來簡要地看看這些方法中的幾種。

使用ordered提示

Oracle必須花費大量的時間來剖析多表格的合併,用以確定表格合併的最佳順序。如果SQL表達式涉及七個乃至更多的表格合併,那麼有時就會需要超過30分鐘的時間來剖析,因為Oracle必須評估表格合併所有可能的順序。八個表格就會有40,000多種順序。 Ordered這個提示(hint)和其他的提示一起使用能夠產生合適的合併順序。

Ordered這個提示會要求列在SQL表達式FROM字句裡的表格按照指定的順序進行合併,FROM字句裡的第一個表格會指定驅動表格(driving table)。驅動表格應該是返回最小行數的表格。使用ordered提示會跳過非常耗時和耗資源的剖析操作,並加快Oracle SQL的執行。

Listing A如下:

Listing A
select /* ordered use_nl(bonus)
parallel(e, 4) */ e.ename, hiredate, b.comm from emp e, bonus b
where e.ename = b.ename ;
Listing A裡是一個複雜查詢的例子,這個查詢被強制進行一個嵌套循環,從而與對emp表格進行的並行查詢合併。要注意,我已經使用ordered提示來引導Oracle去按照WHERE子句所列出的順序來評估表格。

使用theordered_predicates

ordered_predicates提示在查詢的WHERE子句裡指定的,並被用來指定布爾判斷(Boolean predicate)被評估的順序。在沒有ordered_predicates的情況下,Oracle會使用下面這些步驟來評估SQL判斷的順序:

子查詢的評估先於外層WHERE子句裡的Boolean條件。

所有沒有內置函數或者子查詢的布爾條件都按照其在WHERE子句里相反的順序進行評估,即最後一條判斷最先被評估。

每個判斷都帶有內置函數的布爾判斷都依據其預計的評估值按遞增排列。

你可以使用ordered_predicates提示來強制取代這些缺省的評估規則,那麼你WHERE子句裡的項目就會按照其在查詢裡出現的順序被評估。在查詢的WHERE子句裡使用了PL/SQL函數的情況下,通常會使用ordered_predicates提示。如果你知道限制最多的判斷並且希望Oracle最先評估這些判斷的時候,在這種情況下,它也是非常有用的。用法提示:你不能使用ordered_predicates提示來保存對索引鍵進行判斷評估的順序。

限製表格合併評估的數量

提高SQL剖析性能的最後一種方法是強制取代Oracle的一個參數,這個參數控制著在評估一個查詢的時候,基於消耗的優化器所評估的可能合併數量。

optimizer_search_limit這個參數會指定表格合併組合的最大數量,後者將會在Oracle試圖確定合併多表格最佳方式的時候被評估。這個參數有助於防止優化器花更多的時間來評估可能的合併順序,而不是把時間花在尋找最佳合併順序上。 optimizer_search_limit還控制著用於調用star join提示的闕值,當查詢裡的表格數量低於optimizer_search_limit(其缺省的值是5)的時候,star提示就會被光顧。

以上只是一些Oracle DBA用來優化Oracle數據庫應用程序SQL查詢的性能的一些小技巧。

Oracle 9i教材:
20000GC10:Data Modeling and Relational Database Design
40054GC10 – Introduction to Oracle9i:PL/SQL
40054GC11 – Oracle9i:Program with PL/SQL
40055GC11 – Oracle9i:PL/SQL Fundamentals
40056GC11 – Oracle9i:Develop PL/SQL Program Units
40058GC11 – Oracle 9i :Advanced SQL
40060GC10 – Oracle9i:SQL for End Users
40061GC10 – Oracle9i:Advanced PL/SQL [PPT]
D11299GC21 – Oracle9i Performance Tuning Version 2.1(1Z0-033)
D11318GC20 – Oracle9i:New Features for Administrators第二版(1Z0-030)
Introduction to Oracle9i:SQL Version 2.0(1Z0-007)
Oracle9i Database Administration Fundamentals II Version 2.0[含中文版1.1](1Z0-032)
Oracle9i Database Administration Fundamentals I Version 2.0[含中文版1.1](1Z0-031) 

Oracle 9i高級培訓:
D16001GC10 – Oracle9i Database:Using OLAP
D13289GC10 – Oracle9i:Data Warehouse Administration
D12204CN10 – Oracle9iAS:基本管理[中文版](1Z0-301)
D12210GC10 – Oracle9iAS:Wireless Enable Portals and Applications
D11803GC10 – Data Warehouse Database Design
12837GC10 – Oracle9i:Real Application Clusters
D12215GC20 – Oracle Enterprise Manager 9i
D12619GC10 – Oracle9i Database:Data Guard Administration
D12611GC10 – Oracle 9i:Implement Advanced Queuing
D12848GC10 – Oracle9i: Spatial
D13287GC10 – Oracle9i Database:Implement Partitioning
D16442GC10 – Oracle9i Database:Advanced Instance Tuning
D16335GC10 – Oracle9i Database:Real Application Clusters on Linux

Oracle 10g教材:
D17079GC20 – Oracle Database 10g:New Features for Administrators Version 2(1Z0-040)
D17389GC10 – Oracle Database 10g:New Features for Oracle8i DBAs(1Z0-045)
Oracle Database 10g:Administration Workshop I(1Z0-042)
Oracle Database 10g:Administration Workshop II(1Z0-043)(PDF格式)

Oracle 10G高級培訓:
D17276GC10 – Oracle Database 10g:Real Application Clusters
D17244GC11 – Oracle Enterprise Manager 10g Grid Control

Java相關教材:
40003GC50 – Java Programming
D11678GC31 – Oracle9i:Access the Database with Java and JDBC
D12867GC10 – Oracle9i JDeveloper:Develop Applications with BC4J
D12871GC10 – Oracle9i:Create Servlets and JavaServer Pages

其它
其它一些文檔,無法歸類
EClass

APP 11i系列:
14217GC10 – Installing Oracle Applications,Release 11i
14226GC10 – 11i Extend:Customization Standards
14431GC20 – R11i Oracle Applications AD Utilities
14433GC10 – Oracle Applications Architecture,Release 11i & 14433GC21 – R11i Oracle Applications Architecture
14437GC20 – R11i Patching and Maintaining Oracle Applications
14464GC11 – R11i Extend Oracle Applications:Forms
14465GC11 – R11i System Administration
14466GC11 – R11i Defining Flexfields
14468GC11 – R11i Navigating Oracle Applications
14889GC30 – 11i Implement and Administer Marketing Online
14491GC10 – R11i Oracle Account Generator
14492GC11 – R11i Oracle Alert
15001GC10 – 11i e-Commerce Gateway
D11101GC10 – 11i 2.6 Workflow Business Event System
D11102GC10 – 11i Extend:CUSTOM Library
14263GC20(PPT)
14433GC30 – 11i Oracle Applications Architecture(PPT)
14440GC30及14440GC40 – 11i Upgrade Oracle Applications(PPT)
14452GC21 – E-BI(PPT)
14468CN20 -使用Oracle Applications 11i(PPT)
14468GC11及14468GC20 – 11i Navigating Oracle Applications(PPT)
14566GC10(PPT)
14590GC31 – 11i HRMS System Administration(PPT)
14591GC10(PPT)
14676GC40 – Implement Oracle Configurator(PPT)
14677GC40 – Oracle iStore(PPT)
14801GC40 – 11i Implement and Administer CRM Application Foundation(PPT)
14805GC20 – Work Structures HRMS Release 11i(PPT)
14815GC30(PPT)
14828GC30 – 11i Implement and Administer iSupport(PPT)
14834GC10 – Oracle Project:Project Billing(含中文版)(PPT)
14846GC20 – 11i Oracle Receivables(PPT)
14848GC10 – Oracle Cash Management R11i(PPT)
14854GC40 – 11i Implement Scripting(PPT)
14858CN10 – R11i實施和使用Oracle Engineering和Bills of Material(含英文版)(PPT)
14859GC10 – Work In Process(PPT)

點擊下載 

Oracle考古題

怎樣配置EM使其支持SSL 協議
10G EM 中的OMS, DBConsole,Agent 都支持SSL 協議.

具體操作:

1. 如果沒有環境變量ORACLE_SID,請先配置,或者直接敲入set ORACLE_SID=xxx (UNIX環境下請根據不同的shell類型使用不同的語法:setenv, export…)

2. 鍵入 emctl secure ,可以看到全部的選項:
secure oms <sysman password> <registration password>

[<hostname>] [-reset]
secure agent <registration password>
secure em
secure dbconsole <sysman password> <registration password>

[<hostname>]
secure setpwd <sysman password> <registration password>
secure status [oms url]
secure lock | unlock

 

3. 以配置oms為例

   3.1 先停掉所有與oms相關的 服務(opmnctl stopall)

   3.2 敲入: emctl secure oms,會讓妳輸入registration password,然後系統會產生相關的證書文件, 如果壹切順利的話,系統會有提示配置成功的信息

   3.3 重新啟動服務(opmnctl startall)
   缺省情況下,7777和4889這兩個端口是可用的, 配置成secure 模式後,4888端口是支持SSL協議的. 從$EM_HOME\sysman\config目錄下的emoms.properties文件中可以看到配置信息.

   3.4 檢測oms是否已經運行在https協議下

emctl secure status oms url
   註意: URL 要輸入完整,
   例如: http://www.testpassport.net/Oracle/

4. Agent, DBconsole的配置基本類似.

5. 啟動瀏覽器運行時,IE會彈出壹個安裝安全證書的窗口,按”確認”.
二、出現了問題,怎樣解決
以DB Control為例, 大致的步驟是這樣的:

   1. emctl status dbconsole 查看db control 的狀態

   2.去 $ORACLE_HOME\hostname_sid\sysman\log目錄下查看相關日誌(emoms.log,emagent.log等)

   3. 檢查配置文件 emd.properties,emoms.properties
   目錄: $ORACLE_HOME\hostname_sid\sysman\config

   4. 確保監聽器工作正常: lsnrctl status

   5. 10G EM 使用的是配置文件中定義的連接串,而不是直接訪問tnsnames.ora .
   目錄: $ORACLE_HOME\hostname_sid\sysman\config
   文件: emoms.properties.
   參數: oracle.sysman.eml.mntr.emdRepConnectDescriptor

TestPassport證照信息 © Copyright 2009, All Rights Reserved.