隨筆-314  評論-209  文章-0  trackbacks-0
           

          sed  -e ‘s/[ ]*$//g’  文件名

          1. Sed簡介   

        1. sed 是一種在線編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接著用sed命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒有 改變,除非你使用重定向存儲輸出。Sed主要用來自動編輯一個或多個文件;簡化對文件的反復操作;編寫轉換程序等。以下介紹的是Gnu版本的Sed 3.02。   
        2. 2. 定址   
        3. 可以通過定址來定位你所希望編輯的行,該地址用數字構成,用逗號分隔的兩個行數表示以這兩行為起止的行的范圍(包括行數表示的那兩行)。如1,3表示1,2,3行,美元符號($)表示最后一行。范圍可以通過數據,正則表達式或者二者結合的方式確定 。   
        4.   
        5. 3. Sed命令   
        6. 調用sed命令有兩種形式:   
        7. *   
        8. sed [options] ’command’ file(s)   
        9. *   
        10. sed [options] -f scriptfile file(s)   
        11. a\   
        12. 在當前行后面加入一行文本。   
        13. b lable   
        14. 分支到腳本中帶有標記的地方,如果分支不存在則分支到腳本的末尾。   
        15. c\   
        16. 用新的文本改變本行的文本。   
        17. d   
        18. 從模板塊(Pattern space)位置刪除行。   
        19. D   
        20. 刪除模板塊的第一行。   
        21. i\   
        22. 在當前行上面插入文本。   
        23. h   
        24. 拷貝模板塊的內容到內存中的緩沖區。   
        25. H   
        26. 追加模板塊的內容到內存中的緩沖區   
        27. g   
        28. 獲得內存緩沖區的內容,并替代當前模板塊中的文本。   
        29. G   
        30. 獲得內存緩沖區的內容,并追加到當前模板塊文本的后面。   
        31. l   
        32. 列表不能打印字符的清單。   
        33. n   
        34. 讀取下一個輸入行,用下一個命令處理新的行而不是用第一個命令。   
        35. N   
        36. 追加下一個輸入行到模板塊后面并在二者間嵌入一個新行,改變當前行號碼。   
        37. p   
        38. 打印模板塊的行。   
        39. P(大寫)   
        40. 打印模板塊的第一行。   
        41. q   
        42. 退出Sed。   
        43. r file   
        44. 從file中讀行。   
        45. t label   
        46. if分支,從最后一行開始,條件一旦滿足或者T,t命令,將導致分支到帶有標號的命令處,或者到腳本的末尾。   
        47. T label   
        48. 錯誤分支,從最后一行開始,一旦發生錯誤或者T,t命令,將導致分支到帶有標號的命令處,或者到腳本的末尾。   
        49. w file   
        50. 寫并追加模板塊到file末尾。   
        51. W file   
        52. 寫并追加模板塊的第一行到file末尾。   
        53. !   
        54. 表示后面的命令對所有沒有被選定的行發生作用。   
        55. s/re/string   
        56. 用string替換正則表達式re。   
        57. =   
        58. 打印當前行號碼。   
        59. #   
        60. 把注釋擴展到下一個換行符以前。   
        61. 以下的是替換標記   
        62. *   
        63. g表示行內全面替換。   
        64. *   
        65. p表示打印行。   
        66. *   
        67. w表示把行寫入一個文件。   
        68. *   
        69. x表示互換模板塊中的文本和緩沖區中的文本。   
        70. *   
        71. y表示把一個字符翻譯為另外的字符(但是不用于正則表達式)   
        72.   
        73. 4. 選項   
        74. -e command, –expression=command   
        75. 允許多臺編輯。   
        76. -h, –help   
        77. 打印幫助,并顯示bug列表的地址。   
        78. -n, –quiet, –silent   
        79.   
        80. 取消默認輸出。   
        81. -f, –filer=script-file   
        82. 引導sed腳本文件名。   
        83. -V, –version   
        84. 打印版本和版權信息。   
        85.   
        86. 5. 元字符集^   
        87. 錨定行的開始 如:/^sed/匹配所有以sed開頭的行。    
        88. $   
        89. 錨定行的結束 如:/sed$/匹配所有以sed結尾的行。    
        90. .   
        91. 匹配一個非換行符的字符 如:/s.d/匹配s后接一個任意字符,然后是d。    
        92. *   
        93. 匹配零或多個字符 如:/*sed/匹配所有模板是一個或多個空格后緊跟sed的行。   
        94. []  
        95. 匹配一個指定范圍內的字符,如/[Ss]ed/匹配sed和Sed。   
        96. [^]  
        97. 匹配一個不在指定范圍內的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一個字母開頭,緊跟ed的行。   
        98. \(..\)  
        99. 保存匹配的字符,如s/\(love\)able/\1rs,loveable被替換成lovers。   
        100. &  
        101. 保存搜索字符用來替換其他字符,如s/love/**&**/,love這成**love**。    
        102. \<   
        103. 錨定單詞的開始,如:/\<love/匹配包含以love開頭的單詞的行。    
        104. \>   
        105. 錨定單詞的結束,如/love\>/匹配包含以love結尾的單詞的行。    
        106. x\{m\}   
        107. 重復字符x,m次,如:/0\{5\}/匹配包含5個o的行。    
        108. x\{m,\}   
        109. 重復字符x,至少m次,如:/o\{5,\}/匹配至少有5個o的行。    
        110. x\{m,n\}   
        111. 重復字符x,至少m次,不多于n次,如:/o\{5,10\}/匹配5–10個o的行。   
        112. 6. 實例   
        113. 刪除:d命令   
        114. *   
        115. $ sed ’2d’ example—–刪除example文件的第二行。   
        116. *   
        117. $ sed ’2,$d’ example—–刪除example文件的第二行到末尾所有行。   
        118. *   
        119. $ sed ’$d’ example—–刪除example文件的最后一行。   
        120. *   
        121. $ sed ’/test/’d example—–刪除example文件所有包含test的行。   
        122. 替換:s命令   
        123. *   
        124. $ sed ’s/test/mytest/g’ example—–在整行范圍內把test替換為mytest。如果沒有g標記,則只有每行第一個匹配的test被替換成mytest。   
        125. *   
        126. $ sed -n ’s/^test/mytest/p’ example—–(-n)選項和p標志一起使用表示只打印那些發生替換的行。也就是說,如果某一行開頭的test被替換成mytest,就打印它。   
        127. *   
        128. $ sed ’s/^192.168.0.1/&localhost/’ example—–&符號表示替換換字符串中被找到的部份。所有以192.168.0.1開頭的行都會被替換成它自已加 localhost,變成192.168.0.1localhost。   
        129. *   
        130. $ sed -n ’s/\(love\)able/\1rs/p’ example—–love被標記為1,所有loveable會被替換成lovers,而且替換的行會被打印出來。   
        131. *   
        132. $ sed ’s#10#100#g’ example—–不論什么字符,緊跟著s命令的都被認為是新的分隔符,所以,“#”在這里是分隔符,代替了默認的“/”分隔符。表示把所有10替換成100。   
        133. 選定行的范圍:逗號   
        134. *   
        135. $ sed -n ’/test/,/check/p’ example—–所有在模板test和check所確定的范圍內的行都被打印。   
        136. *   
        137. $ sed -n ’5,/^test/p’ example—–打印從第五行開始到第一個包含以test開始的行之間的所有行。   
        138. *   
        139. $ sed ’/test/,/check/s/$/sed test/’ example—–對于模板test和west之間的行,每行的末尾用字符串sed test替換。   
        140. 多點編輯:e命令   
        141. *   
        142. $ sed -e ’1,5d’ -e ’s/test/check/’ example—–(-e)選項允許在同一行里執行多條命令。如例子所示,第一條命令刪除1至5行,第二條命令用check替換test。命令的執 行順序對結果有影響。如果兩個命令都是替換命令,那么第一個替換命令將影響第二個替換命令的結果。   
        143. *   
        144. $ sed –expression=’s/test/check/’ –expression=’/love/d’ example—–一個比-e更好的命令是–expression。它能給sed表達式賦值。   
        145. 從文件讀入:r命令   
        146. *   
        147. $ sed ’/test/r file’ example—–file里的內容被讀進來,顯示在與test匹配的行后面,如果匹配多行,則file的內容將顯示在所有匹配行的下面。   
        148. 寫入文件:w命令   
        149. *   
        150. $ sed -n ’/test/w file’ example—–在example中所有包含test的行都被寫入file里。   
        151. 追加命令:a命令   
        152. *   
        153. $ sed ’/^test/a\\—>this is a example’ example<—–’this is a example’被追加到以test開頭的行后面,sed要求命令a后面有一個反斜杠。   
        154. 插入:i命令   
        155. $ sed ’/test/i\\   
        156. new line   
        157. ————————-’ example   
        158. 如果test被匹配,則把反斜杠后面的文本插入到匹配行的前面。   
        159. 下一個:n命令   
        160. *   
        161. $ sed ’/test/{ n; s/aa/bb/; }’ example—–如果test被匹配,則移動到匹配行的下一行,替換這一行的aa,變為bb,并打印該行,然后繼續。   
        162. 變形:y命令   
        163. *   
        164. $ sed ’1,10y/abcde/ABCDE/’ example—–把1–10行內所有abcde轉變為大寫,注意,正則表達式元字符不能使用這個命令。   
        165. 退出:q命令   
        166. *   
        167. $ sed ’10q’ example—–打印完第10行后,退出sed。   
        168. 保持和獲取:h命令和G命令   
        169. *   
        170. $ sed -e ’/test/h’ -e ’$G example—–在sed處理文件的時候,每一行都被保存在一個叫模式空間的臨時緩沖區中,除非行被刪除或者輸出被取消,否則所有被處理的行都將 打印在屏幕上。接著模式空間被清空,并存入新的一行等待處理。在這個例子里,匹配test的行被找到后,將存入模式空間,h命令將其復制并存入一個稱為保 持緩存區的特殊緩沖區內。第二條語句的意思是,當到達最后一行后,G命令取出保持緩沖區的行,然后把它放回模式空間中,且追加到現在已經存在于模式空間中 的行的末尾。在這個例子中就是追加到最后一行。簡單來說,任何包含test的行都被復制并追加到該文件的末尾。   
        171. 保持和互換:h命令和x命令   
        172. *   
        173. $ sed -e ’/test/h’ -e ’/check/x’ example —–互換模式空間和保持緩沖區的內容。也就是把包含test與check的行互換。   
        174. 7. 腳本   
        175. Sed腳本是一個sed的命令清單,啟動Sed時以-f選項引導腳本文件名。Sed對于腳本中輸入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多個命令,要用分號分隔。以#開頭的行為注釋行,且不能跨行。  
        176. 文章作者:孫劍和
          本文地址:http://www.sunjianhe.com/?p=342
          版權所有 © 轉載時必須以鏈接形式注明作者和原始出處!

          posted @ 2010-12-28 11:55 xzc 閱讀(11307) | 評論 (1)編輯 收藏

          一、ORACLE10g自動收集統計信息--自動analyze

          Oracle Database 10g開始,Oracle在建庫后就默認創建了一個名為GATHER_STATS_JOB的定時任務,用于自動收集CBO的統計信息。

          這個自動任務默認情況下在工作日晚上10:00-6:00和周末全天開啟。調用DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC收集統計信息。該過程首先檢測統計信息缺失和陳舊的對象。然后確定優先級,再開始進行統計信息。

          可以通過以下查詢這個JOB的運行情況:

           

          select * from Dba_Scheduler_Jobs where JOB_NAME ='GATHER_STATS_JOB'

          其實同在10點運行的Job還有一個AUTO_SPACE_ADVISOR_JOB:

           

          SQL> select JOB_NAME,LAST_START_DATE from dba_scheduler_jobs;

          JOB_NAME                      LAST_START_DATE

          ------------------------------ --------------------------------------

          AUTO_SPACE_ADVISOR_JOB        04-DEC-07 10.00.00.692269 PM +08:00

          GATHER_STATS_JOB              04-DEC-07 10.00.00.701152 PM +08:00

          FGR$AUTOPURGE_JOB

          PURGE_LOG                      05-DEC-07 03.00.00.169059 AM PRC

          然而這個自動化功能已經影響了很多系統的正常運行,晚上10點對于大部分生產系統也并非空閑時段。

          而自動分析可能導致極為嚴重的閂鎖競爭,進而可能導致數據庫Hang或者Crash。

          所以建議最好關閉這個自動統計信息收集功能:

           

          exec DBMS_SCHEDULER.DISABLE('GATHER_STATS_JOB');

          自動化永遠而嚴重的隱患相伴隨!

           

          關閉及開啟自動搜集功能,有兩種方法,分別如下:

          方法一: 

          exec dbms_scheduler.disable('SYS.GATHER_STATS_JOB');

          exec dbms_scheduler.enable('SYS.GATHER_STATS_JOB');

          方法二:

          alter system set "_optimizer_autostats_job"=false scope=spfile;

          alter system set "_optimizer_autostats_job"=true scope=spfile;

          Pfile可以直接修改初始化參數文件,重新啟動數據庫

          二、AWR默認通過MMON及MMNL進程來每小自動運行一次,為了節省空間,采集的數據在 7 天后自動清除。

          快照頻率和保留時間都可以由用戶修改。要查看當前的設置,您可以使用下面的語句:

          select snap_interval, retention

          from dba_hist_wr_control;

          SNAP_INTERVAL       RETENTION

          ------------------- -------------------
            +00000 01:00:00.0   +00007 00:00:00.0

           這些 SQL 語句顯示快照每小時采集一次,采集的數據保留 7 天。要修改設置 例如,快照時間間隔為 20 分鐘,保留時間為兩天 您可以發出以下命令。參數以分鐘為單位。

          begin

             dbms_workload_repository.modify_snapshot_settings (

                interval => 20,

                retention => 2*24*60

             );end;

          AWR 使用幾個表來存儲采集的統計數據,所有的表都存儲在新的名稱為 SYSAUX 的特定表空間中的 SYS 模式下,并且以 WRM$_* 和 WRH$_* 的格式命名。前一種類型存儲元數據信息(如檢查的數據庫和采集的快照),后一種類型保存實際采集的統計數據。(您可能已經猜到,H 代表“歷史數據 (historical)”而 M 代表“元數據 (metadata)”。)在這些表上構建了幾種帶前綴 DBA_HIST_ 的視圖,這些視圖可以用來編寫您自己的性能診斷工具。視圖的名稱直接與表相關;例如,視圖 DBA_HIST_SYSMETRIC_SUMMARY 是在WRH$_SYSMETRIC_SUMMARY 表上構建的。

          您的處理計劃一般是有規律的,并且通常基于您對各種事件的了解和您處理它們的經驗。現在設想相同的事情由一個引擎來完成,這個引擎采集量度并根據預先確定的邏輯來推出可能的計劃。您的工作不就變得更輕松了嗎? 現在在 Oracle Database 10g 中推出的這個引擎稱為自動數據庫診斷監控程序 (ADDM)。為了作出決策,ADDM 使用了由 AWR 采集的數據。

          在 AWR 進行的每一次快照采集之后,調用 ADDM 來檢查量度并生成建議。因此,實際上您擁有了一個一天二十四小時工作的自動數據庫管理員,它主動地分析數據并生成建議,從而把您解放出來,使您能夠關注更具有戰略意義的問題。

          快照默認是自動采集的,但您也可以按需要采集它們。所有的 AWR 功能都在程序包 DBMS_WORKLOAD_REPOSITORY 中實施。要采集一次快照,只需發出下面的命令:

          execute dbms_workload_repository.create_snapshot它立即采集一次快照,快照被記錄在表 WRM$_SNAPSHOT 中。采集的量度是針對 TYPICAL 級別的。如果您想采集更詳細的統計數據,您可以在上面的過程中將參數 FLUSH_LEVEL 設置為 ALL。統計數據自動刪除,但也可以通過調用過程 drop_snapshot_range() 來手動刪除。

          posted @ 2010-12-15 15:12 xzc 閱讀(2789) | 評論 (0)編輯 收藏
          什么時候使用分區:
            1、 大數據量的表,比如大于2GB。一方面2GB文件對于32位os是一個上限,另外備份時間長。
            2、 包括歷史數據的表,比如最新的數據放入到最新的分區中。典型的例子:歷史表,只有當前月份的數據可以被修改,而其他月份只能read-on
          ly
            ORACLE只支持以下分區:tables, indexes on tables, materialized views, and indexes on materialized views
            分區對SQL和DML是透明的(應用程序不必知道已經作了分區),但是DDL可以對不同的分區進行管理。
            不同的分區之間必須有相同的邏輯屬性,比如共同的表名,列名,數據類型,約束;
            但是可以有不同的物理屬性,比如pctfree, pctused, and tablespaces.
            分區獨立性:即使某些分區不可用,其他分區仍然可用。
            最多可以分成64000個分區,但是具有LONG or LONG RAW列的表不可以,但是有CLOB or BLOB列的表可以。
            可以不用to_date函數,比如:
            alter session set nls_date_format='mm/dd/yyyy';
            CREATE TABLE sales_range
            (salesman_id NUMBER(5),
            salesman_name VARCHAR2(30),
            sales_amount NUMBER(10),
            sales_date DATE)
            PARTITION BY RANGE(sales_date)
            (
            PARTITION sales_jan2000 VALUES LESS THAN('02/01/2000'),
            PARTITION sales_feb2000 VALUES LESS THAN('03/01/2000'),
            PARTITION sales_mar2000 VALUES LESS THAN('04/01/2000'),
            PARTITION sales_apr2000 VALUES LESS THAN('05/01/2000')
            );
            Partition Key:最多16個columns,可以是nullable的
            非分區的表可以有分區或者非分區的索引;
            分區表可以有分區或者非分區的索引;
            Partitioning 方法:
            Range Partitioning
            List Partitioning
            Hash Partitioning
            Composite Partitioning
            Composite Partitioning:組合,以及 range-hash and range-list composite partitioning
            Range Partitioning:
            每個分區都有VALUES LESS THAN子句,表示這個分區小于(<)某個上限,而大于等于(>=)前一個分區的VALUES LESS THAN值。
            MAXVALUE定義最高的分區,他表示一個虛擬的無限大的值。這個分區包括null值。
            CREATE TABLE sales_range
            (salesman_id NUMBER(5),
            salesman_name VARCHAR2(30),
            sales_amount NUMBER(10),
            sales_date DATE)
            PARTITION BY RANGE(sales_date)
            (
            PARTITION sales_jan2000 VALUES LESS THAN(TO_DATE('01/02/2000','DD/MM/YYYY')),
            PARTITION sales_feb2000 VALUES LESS THAN(TO_DATE('01/03/2000','DD/MM/YYYY')),
            PARTITION sales_mar2000 VALUES LESS THAN(TO_DATE('01/04/2000','DD/MM/YYYY')),
            PARTITION sales_apr2000 VALUES LESS THAN(TO_DATE('01/05/2000','DD/MM/YYYY')),
            PARTITION sales_2000 VALUES LESS THAN(MAXVALUE)
            );
            插入數據:
            Insert into sales_range values(1,2,3,to_date('21-04-2000','DD-MM-YYYY'));
            Insert into sales_range values(1,2,3,sysdate);
            選擇數據:
            select * from sales_range;
            select * from sales_range partition(sales_apr2000);
            select * from sales_range partition(sales_mar2000);
            select * from sales_range partition(sales_2000);
            按照多個列分區:
            CREATE TABLE sales_range1
            (salesman_id NUMBER(5),
            salesman_name VARCHAR2(30),
            sales_amount NUMBER(10),
            sales_date DATE)
            PARTITION BY RANGE(sales_date, sales_amount)
            (
            PARTITION sales_jan2000 VALUES LESS THAN(TO_DATE('01/02/2000','DD/MM/YYYY'),1000),
            PARTITION sales_feb2000 VALUES LESS THAN(TO_DATE('01/03/2000','DD/MM/YYYY'),2000),
            PARTITION sales_mar2000 VALUES LESS THAN(TO_DATE('01/04/2000','DD/MM/YYYY'),3000),
            PARTITION sales_apr2000 VALUES LESS THAN(TO_DATE('01/05/2000','DD/MM/YYYY'),4000),
            PARTITION sales_2000 VALUES LESS THAN(MAXVALUE, MAXVALUE)
            )
          Insert into sales_range1 values(1,2,500, TO_DATE('21/01/2000','DD/MM/YYYY'));
            Insert into sales_range1 values(2,3,1500, sysdate);
            如果多個分區列的值沖突,則按照從左到右的優先級。
            List Partitioning:
            可以組織無序的,或者沒有關系的數據在相同的分區。
            不支持多列的(multicolumn) partition keys,只能是一個列。
            DEFAULT表示不滿足條件的都放在這個分區。
            CREATE TABLE sales_list
            (salesman_id NUMBER(5),
            salesman_name VARCHAR2(30),
            sales_state VARCHAR2(20),
            sales_amount NUMBER(10),
            sales_date DATE)
            PARTITION BY LIST(sales_state)
            (
            PARTITION sales_west VALUES('California', 'Hawaii'),
            PARTITION sales_east VALUES ('New York', 'Virginia', 'Florida'),
            PARTITION sales_central VALUES('Texas', 'Illinois'),
            PARTITION sales_other VALUES(DEFAULT)
            );
            Hash Partitioning:
            不可以作splitting, dropping or merging操作。但是可以added and coalesced.
            當我們無法判斷有多少數據映射或者怎樣映射到各個分區時,可以使用這種方法。分區數據最好是2的冪,這樣可以平均分配數據。
            CREATE TABLE sales_hash1
            (salesman_id NUMBER(5),
            salesman_name VARCHAR2(30),
            sales_amount NUMBER(10),
            week_no NUMBER(2))
            PARTITION BY HASH(salesman_id)
            PARTITIONS 4
            STORE IN (users, TOOLS, TEST, TABLESPACE1);  --表空間
            CREATE TABLE sales_hash
            (salesman_id NUMBER(5),
            salesman_name VARCHAR2(30),
            sales_amount NUMBER(10),
            week_no NUMBER(2))
            PARTITION BY HASH(salesman_id)
            (
            PARTITION p1 tablespace users,
            PARTITION p2 tablespace system
            );
            Composite Partitioning:
            先按照range分區,每個子分區又按照list or hash分區。
            CREATE TABLE sales_composite
            (salesman_id NUMBER(5),
            salesman_name VARCHAR2(30),
            sales_amount NUMBER(10),
            sales_date DATE)
            PARTITION BY RANGE(sales_date)
            SUBPARTITION BY HASH(salesman_id)  --子分區
            SUBPARTITION TEMPLATE(
            SUBPARTITION sp1 TABLESPACE data1,
            SUBPARTITION sp2 TABLESPACE data2,
            SUBPARTITION sp3 TABLESPACE data3,
            SUBPARTITION sp4 TABLESPACE data4)
            (PARTITION sales_jan2000 VALUES LESS THAN(TO_DATE('02/01/2000','DD/MM/YYYY'))
            PARTITION sales_feb2000 VALUES LESS THAN(TO_DATE('03/01/2000','DD/MM/YYYY'))
            PARTITION sales_mar2000 VALUES LESS THAN(TO_DATE('04/01/2000','DD/MM/YYYY'))
            PARTITION sales_apr2000 VALUES LESS THAN(TO_DATE('05/01/2000','DD/MM/YYYY'))
            PARTITION sales_may2000 VALUES LESS THAN(TO_DATE('06/01/2000','DD/MM/YYYY')));
            使用TEMPLATE,oracle會這樣命名子分區:分區_子分區,比如sales_jan2000_sp1表示將數據放在data1表空間
            Range-list:
            CREATE TABLE bimonthly_regional_sales
            (deptno NUMBER,
            item_no VARCHAR2(20),
            txn_date DATE,
            txn_amount NUMBER,
            state VARCHAR2(2))
            PARTITION BY RANGE (txn_date)
            SUBPARTITION BY LIST (state)
            SUBPARTITION TEMPLATE(
            SUBPARTITION east VALUES('NY', 'VA', 'FL') TABLESPACE system,
            SUBPARTITION west VALUES('CA', 'OR', 'HI') TABLESPACE users,
            SUBPARTITION central VALUES('IL', 'TX', 'MO') TABLESPACE tools)
            ( PARTITION janfeb_2000 VALUES LESS THAN (TO_DATE('1-03-2000','DD-Mm-YYYY')), PARTITION marapr_2000 VALUES LESS THAN (TO_DATE('1-05-2000','DD-Mm-YYYY')), PARTITION mayjun_2000 VALUES LESS THAN (TO_DATE('1-07-2000','DD-Mm-YYYY')) )
          posted @ 2010-12-13 15:19 xzc 閱讀(299) | 評論 (0)編輯 收藏
          因為Xmanager使用的是自己的字體,HP_unix在登陸的時候默認使用的字體是zh_CN.hp15CN,所以在登陸的時候會產生亂碼。解決方法有兩個:
          第一、使用en_GB.roman8。因為xmanager這個字體與hpux的字體相同,所以使用en_GB.roman8就不會產生亂碼。
          在/etc/dt/config/Xconfig中Dtlogin*language: en_GB.roman8即可;
          第二、使用HP_UNIX的zh_CN.hp15CN字體。
          1.在你的裝有Xmanager的微機中新建文件夾:
          mkdir c:\program fils/Xmanager1.3.8/font/hpux,
          2.拷貝/usr/lib/X11/fonts/hp_chinese_s/75dpi/*pcf至此目錄。
          3.用Xmanager的mkfntdir生成font.dir文件。
          cd c:\program files\Xmanager1.3.8/font/hpux
          c:\profram files\Xmanager1.3.8\Mkfntdir
          4.將此字體目錄添加到Xmanager的字體目錄中去。(在Xconfig中的font directory中添加新生成的目錄,并刪除其他目錄,但是要留下hp目錄)。
          posted @ 2010-12-13 14:33 xzc 閱讀(1247) | 評論 (0)編輯 收藏
          alter table test nologging
          insert /*+ append */ into test select
           
           
          ask tom上有過一篇文章,是說Oracle實際上需要滿足表是nologging和insert /*+append*/兩個條件才真正實現nologging的
           
           
          在insert數據量很大的時候(千萬級),減少redo的產生對性能應該有很大的提高。
          這是一個使用append和nologging對redo產生情況的實驗。
          結論:
          -------------------------------
          一、非歸檔模式下:
          沒有優化前    (1281372  redo size)
          1、單一的使用nologging參數,對redo的產生沒有什么影響。  (1214836  redo size)
          2、單一的使用append提示,redo的減少很顯著              (43872  redo size)
          3、nologging+append,更顯著                             (1108  redo size)
          二、歸檔模式下:
          沒有優化前:           
          1、單獨使用nologging參數,(1231904  redo size)
          2、單獨使用append提示,  (1245804  redo size)
          3、nologging + append,     (3748  redo size)

          a、使用nologging參數并不代表在dml操作中,oracle不產生redo,只是對于指定表的更新數據不產生redo,但是oracle還是要記錄這些操作,所以無論怎么優化,dml操作肯定要產生redo,但是使用這些參數對redo size的影響還是非常可觀的。
          b、單獨使用nologging參數,對redo size沒有多少影響,只有和append配合時,才能產生效果。
          c、單獨使用append提示,對redo的產生影響很大,這是我到現在都不明白的道理,按說append是繞過freelists,直接去尋找新塊,能減少對freelists的爭用,為什么會少這么多redo呢?
          d、歸檔模式和非歸檔模式下,參數影響不一樣,尤其是單獨使用append參數時,看來oracle對歸檔模式下出于安全考慮還是要多一些。
          文章出處:http://www.diybl.com/course/7_databases/oracle/Oracleshl/2008810/135707.html
           
           
          1.Nologging的設置跟數據庫的運行模式有關

          a.數據庫運行在非歸檔模式下:

          SQL> archive log list;

          Database log mode              No Archive Mode
          Automatic archival             Enabled
          Archive destination            /opt/oracle/oradata/hsjf/archive
          Oldest online log sequence     155
          Current log sequence           157

          SQL> @redo

          SQL> create table test as select * from dba_objects where 1=0;

          Table created.

          SQL> select * from redo_size;

               VALUE
          ----------
               63392

          SQL>

          SQL> insert into test select * from dba_objects;

          10470 rows created.

          SQL> select * from redo_size;

               VALUE
          ----------
             1150988

          SQL>

          SQL> insert into test select * from dba_objects;

          10470 rows created.

          SQL> select * from redo_size;

               VALUE
          ----------
             1152368

          SQL> select (1152368 -1150988) redo_append,(1150988 -63392) redo from dual;

          REDO_APPEND       REDO
          ----------- ----------
                 1380    1087596

          SQL> drop table test;

          Table dropped. 

          我們看到在Noarchivelog模式下,對于常規表的insert append只產生少量redo

          b.在歸檔模式下

          SQL> shutdown immediate

          Database closed.
          Database dismounted.
          ORACLE instance shut down.

          SQL> startup mount

          ORACLE instance started.

          Total System Global Area  235999908 bytes

          Fixed Size                   451236 bytes
          Variable Size             201326592 bytes
          Database Buffers           33554432 bytes
          Redo Buffers                 667648 bytes
          Database mounted.

          SQL> alter database archivelog;

          Database altered.

          SQL> alter database open;

          Database altered.

          SQL> @redo

          SQL> create table test as select * from dba_objects where 1=0;

          Table created.

          SQL> select * from redo_size;

               VALUE
          ----------
               56288

          SQL>

          SQL> insert into test select * from dba_objects;

          10470 rows created.

          SQL> select * from redo_size;

               VALUE
          ----------
             1143948

          SQL>

          SQL> insert into test select * from dba_objects;

          10470 rows created.

          SQL> select * from redo_size;

               VALUE
          ----------
             2227712

          SQL> select (2227712 -1143948) redo_append,(1143948 -56288) redo from dual;

          REDO_APPEND       REDO
          ----------- ----------
              1083764    1087660

          SQL> drop table test;

          Table dropped. 

          我們看到在歸檔模式下,對于常規表的insert append產生和insert同樣的redo
          此時的insert append實際上并不會有性能提高.
          但是此時的append是生效了的

          通過Logmnr分析日志得到以下結果:

          SQL> select operation,count(*)
            from v$logmnr_contents
            group by operation;

          OPERATION                          COUNT(*)
          -------------------------------- ----------
          COMMIT                                   17
          DIRECT INSERT                         10470 
          INTERNAL                                 49
          START                                    17

          我們注意到這里是DIRECT INSERT,而且是10470條記錄,也就是每條記錄都記錄了redo.

          2.對于Nologging的table的處理

          a. 在歸檔模式下:

          SQL> create table test nologging as select * from dba_objects where 1=0;

          Table created.

          SQL> select * from redo_size;

               VALUE
          ----------
             2270284

          SQL>

          SQL> insert into test select * from dba_objects;

          10470 rows created.

          SQL> select * from redo_size;

               VALUE
          ----------
             3357644

          SQL>

          SQL> insert into test select * from dba_objects;

          10470 rows created.

          SQL> select * from redo_size;

               VALUE
          ----------
             3359024

          SQL> select (3359024 -3357644) redo_append,(3357644 - 2270284) redo from dual;

          REDO_APPEND       REDO
          ----------- ----------
                 1380    1087360

          SQL> drop table test;

          Table dropped.  

          我們注意到,只有append才能減少redo

          b.在非歸檔模式下:

          SQL> shutdown immediate

          Database closed.
          Database dismounted.
          ORACLE instance shut down.

          SQL> startup mount

          ORACLE instance started.

          Total System Global Area  235999908 bytes
          Fixed Size                   451236 bytes
          Variable Size             201326592 bytes
          Database Buffers           33554432 bytes
          Redo Buffers                 667648 bytes
          Database mounted.

          SQL> alter database noarchivelog;

          Database altered.

          SQL> alter database open;

          Database altered.

          SQL> @redo

          SQL> create table test nologging as select * from dba_objects where 1=0;

          Table created.

          SQL> select * from redo_size;

               VALUE
          ----------
               56580

          SQL>

          SQL> insert into test select * from dba_objects;

          10470 rows created.

          SQL> select * from redo_size;

               VALUE
          ----------
             1144148

          SQL>

          SQL> insert into test select * from dba_objects;

          10470 rows created.

          SQL> select * from redo_size;

               VALUE
          ----------
             1145528

          SQL> select (1145528 -1144148) redo_append,(1144148 -56580) redo from dual;

          REDO_APPEND       REDO
          ----------- ----------
                 1380    1087568

          SQL>

          posted @ 2010-12-07 17:24 xzc 閱讀(1893) | 評論 (0)編輯 收藏

          oracle 10g for hp HP-UX Itanium 11.31 installation
          標簽:hp-ux上安裝oracle10g   

          1,硬件信息檢驗:
          /usr/sbin/dmesg | grep "Physical:" 確定物理RAM高于1000M
          /usr/sbin/swapinfo -a   確定交換分區有沒有空間
          bdf /tmp                確定tmp的空閑空間,要保障在400M以上
          (擴展/tmp要到init 1但用戶狀態去umount掉,
          lvextend -L 800 /dev/vg00/lvol5(/tmp所在的lv) /dev/dsk/盤號)
          extendfs -F vxfs /dev/vg00/lvol5)
          bdf                     確定磁盤大小,需要2個大于4.7G的磁盤系統
          # /bin/getconf KERNEL_BITS   確定系統是否64位

          2,檢查軟件需求:
          uname -a 檢查操作系統版本:必須是hp-ux 11i v3
             show_patches|grep PHKL_40240
             show_patches|grep PHKL_39624
             show_patches|grep PHKL_39625
          注:hp Unix patch 每個季度都會有更新

          確定hp 系統patch已經打上,如果沒有,到itrc找到patch打上。
          (swinstall -s 完全路徑。先解析,再install)
          3,java -version        查看java版本。必須安裝Java版本SDK1.4.2。
          (如果不能直接打出,把/opt/java1.4/bin/:加入 /.profile的PATH=中,再加入
          export JAVA_HOME=/opt/java1.4)


          4,創建需要的UNIX組和用戶


          #/usr/sbin/groupadd oinstall
          #/usr/sbin/groupadd dba

          創建oracle用戶:
          #/usr/sbin/useradd -g oinstall -G dba –m oracle
          passwd oracle



          5,創建必需目錄:
          mkdir /orabin
          mkdir -p /orabin/oracle

          mkdir /archive         
          chmod -R 775 /orabin /archive
          chown oracle:dba /orabin
          chown oracle:dba /archive

          6,配置內核參數:
          6.1 Kernel需求表:
          Parameter Recommended Formula or Value
          ksi_alloc_max (nproc*8) --32768
          max_thread_proc 256
          maxdsiz 1073741824 (1 GB)
          maxdsiz_64bit 2147483648 (2 GB)
          Oracle Database 21
          maxssiz 134217728 (128 MB)
          maxssiz_64bit 1073741824 (1 GB)
          maxswapchunks 16384    --
          maxuprc ((nproc*9)/10) --3687
          msgmap (2+msgmni)
          msgmni 4096
          msgseg 32767
          msgtql 4096
          ncsize (ninode+vx_ncsize) 34816
          nfile (15*nproc+2048) 61664
          nflocks 4096
          ninode (8*nproc+2048) 34816
          nkthread (((nproc*7)/4)+16) 7184
          nproc 4096
          semmap (semmni+2)
          semmni 4096
          semmns (semmni*2)
          semmnu (nproc-4)
          semvmx 32767
          shmmax The size of physical memory (0X40000000) or
          1073741824, whichever is greater.
          shmmni 512
          shmseg 120
          vps_ceiling 64
          (參數含義請看參數說明)
          #調整內核參數
          6.2 #kctune 查內核參數
          kctune -h -B nproc="4200"
          kctune -h -B ksi_alloc_max="33600"
          kctune -h -B max_thread_proc="1100"
          kctune -h -B maxdsiz="1073741824"
          kctune -h -B maxdsiz_64bit="4294967296"
          kctune -h -B maxssiz="134217728"
          kctune -h -B maxssiz_64bit="1073741824"
          kctune -h -B maxuprc="3688"
          kctune -h -B msgmni="4096"
          kctune -h -B msgtql="4096"
          kctune -h -B ncsize="35840"
          kctune -h -B nflocks="4096"
          kctune -h -B ninode="34816"
          kctune -h -B nkthread="8416"
          kctune -h -B semmni="8192"
          kctune -h -B semmns="16384"
          kctune -h -B semmnu="4092"
          kctune -h -B semvmx="32767"
          kctune -h -B shmmax="34359738368"
          kctune -h -B shmmni="512"
          kctune -h -B shmseg="300"
          kctune -h -B vps_ceiling="64"


          如果更改了制定的static參數。需重建kernel和重起系統。
          重起系統,用root登錄

           


          7,把安裝盤mount上(把安裝介質傳上去)

          用oracle用戶登錄,并修改oracle用戶的環境(shell)
          7.1、打開另一個會話終端
          7.2、輸入命令并確定是否可以用在終端輸出圖形化界面:
          $ xhost +
          7.3、完成一下步驟:
             在這里安裝oracle,切換到oracle用戶。$ su - oracle
          7.4、輸入命令確定oracle的默認SHELL
          #echo $SHELL
          /sbin/sh(每個用戶所使用的sh都不一樣)

          8,更改環境變量:
          $ vi .profile
          加入以下行:
          export ORACLE_BASE=/orabin/oracle
          export ORACLE_HOME=$ORACLE_BASE/product/10.2.0.1/db_1
          export PATH=:$ORACLE_HOME/bin:$PATH:$ORACLE_HOME/OPatch
          export NLS_LANG=american_america.zhs16gbk
          export ORACLE_SID=oracle


          9,編輯好之后logout再 su – oracle
          $echo $ORACLE_HOME
          輸出ORACLE_HOME的路徑

          安裝ORACLE軟件:
          拷貝文件到一個文件系統下,例如:/file/database

          注意到用戶和組為oracle:dba
          如果不是執行:
          chown –R oracle:dba database 把他所屬用戶為oracle所屬組為dba
          chmod –R 775 databse      更改他的執行權限為755
          export DISPLAY= 192.168.61.222:0.0
          xhost +
          su – oracle 切換到oracle用戶
          echo $DISPLAY 查看輸出目錄

          如果不是本機的IP地址,執行:
          export DISPLAY=LOCALHOST_IP:0.0
          然后進入oracle_databse所在目錄,進行安裝oracle
          cd /file/databse
          ./ runInstaller -ignoreSysPreReqs

          10,如果提示swap分區不夠大,做如下操作:
          vgdisplay –v 看看哪個disk上還有空余的空間。(free要*pe值)
          lvcreate –L xxx(需要臨時swap分區的大小) –n myswap(lv名字) vg00(所在的vg名)

          newfs -F vxfs -o largefiles /dev/vg01/rmyswap(注意lv名前有r)
          swapon /dev/vg00 /myswap

          11,安裝完成之后,需要用root用戶run兩個腳本
          再打開一個會話窗口,執行:
          /orabin/oracle/oraInventory/orainstRoot.sh
          /orabin/oracle/product/10.2.0.1/root.sh


          12,上傳 oracle 10.2.0.4補丁
          以同樣的方法安裝oracle 10.2.0.4 補丁

           


          13,配置監聽:
          netca


          14, 建庫
          dbca

          使用裸設備
          14.1 先創建裸設備
          lvcreate -L 6000 -n system01.dbf vg00
          lvcreate -L 5000 -n users01.dbf vg00
          lvcreate -L 5000 -n temp01.dbf vg00
          lvcreate -L 2000 -n undotbs01.dbf vg00
          lvcreate -L 2000 -n undotbs02.dbf vg00
          lvcreate -L 50 -n control01.ctl vg00
          lvcreate -L 50 -n control02.ctl vg00
          lvcreate -L50 -n control03.ctl vg00
          lvcreate -L 500 -n redo01.log vg00
          lvcreate -L 500 -n redo02.log vg00
          lvcreate -L 500 -n redo03.log vg00
          lvcreate -L 5000 -n sysaux01.dbf vg00
          lvcreate -L 50 -n spfileoracle.ora vg00


          14.2 改變裸設備的權限為oracle:dba
          chown oracle:dba /dev/vg00/rsystem01.dbf
          chown oracle:dba /dev/vg00/rusers01.dbf
          chown oracle:dba /dev/vg00/rtemp01.dbf
          chown oracle:dba /dev/vg00/rundotbs01.dbf
          chown oracle:dba /dev/vg00/rcontrol01.ctl
          chown oracle:dba /dev/vg00/rcontrol02.ctl
          chown oracle:dba /dev/vg00/rcontrol03.ctl
          chown oracle:dba /dev/vg00/rredo01.log
          chown oracle:dba /dev/vg00/rredo02.log
          chown oracle:dba /dev/vg00/rredo03.log
          chown oracle:dba /dev/vg00/rsysaux01.dbf
          chown oracle:dba /dev/vg00/rspfileoracle.ora

          14.3 創建軟連接
          ln -s /dev/vg00/rspfileoracle.ora /orabin/product/10.2.0.1/db_1/dbs/spfileoracle .ora
          ln -s /dev/vg00/rsystem01.dbf /orabin/oradata/oracle/system01.dbf
          ln -s /dev/vg00/rusers01.dbf /orabin/oradata/oracle/users01.dbf
          ln -s /dev/vg00/rtemp01.dbf /orabin/oradata/oracle/temp01.dbf
          ln -s /dev/vg00/rundotbs01.dbf /orabin/oradata/oracle/undotbs01.dbf
          ln -s /dev/vg00/rundotbs02.dbf /orabin/oradata/oracle/undotbs02.dbf
          ln -s /dev/vg00/rcontrol01.ctl /orabin/oradata/oracle/control01.ctl
          ln -s /dev/vg00/rcontrol02.ctl /orabin/oradata/oracle/control02.ctl
          ln -s /dev/vg00/rcontrol03.ctl /orabin/oradata/oracle/control03.ctl
          ln -s /dev/vg00/rredo01.log /orabin/oradata/oracle/redo01.log
          ln -s /dev/vg00/rredo02.log /orabin/oradata/oracle/redo02.log
          ln -s /dev/vg00/rredo03.log /orabin/oradata/oracle/redo03.log
          ln -s /dev/vg00/rsysaux01.dbf /orabin/oradata/oracle/sysaux01.dbf

           

          14.4 查看裸設備的權限和屬組
          # ll /dev/vg00/r*
          crw-r-----   1 root       sys         64 0x000017 Dec 3 15:26 /dev/vg00/rarchive
          crw-r-----   1 oracle     dba         64 0x00000f Dec 3 15:10 /dev/vg00/rcontrol01.ctl
          crw-r-----   1 oracle     dba         64 0x000010 Dec 3 15:10 /dev/vg00/rcontrol02.ctl
          crw-r-----   1 oracle     dba         64 0x000011 Dec 3 15:10 /dev/vg00/rcontrol03.ctl
          brw-r-----   1 oracle     dba         64 0x000012 Dec 3 15:10 /dev/vg00/redo01.log
          brw-r-----   1 oracle     dba         64 0x000013 Dec 3 15:10 /dev/vg00/redo02.log
          brw-r-----   1 oracle     dba         64 0x000014 Dec 3 15:10 /dev/vg00/redo03.log
          crw-r-----   1 root       sys         64 0x000001 Dec 3 11:44 /dev/vg00/rlvol1
          crw-r-----   1 root       sys         64 0x000002 Dec 3 11:44 /dev/vg00/rlvol2
          crw-r-----   1 root       sys         64 0x000003 Dec 3 11:44 /dev/vg00/rlvol3
          crw-r-----   1 root       sys         64 0x000004 Dec 3 11:44 /dev/vg00/rlvol4
          crw-r-----   1 root       sys         64 0x000005 Dec 3 11:44 /dev/vg00/rlvol5
          crw-r-----   1 root       sys         64 0x000006 Dec 3 11:44 /dev/vg00/rlvol6
          crw-r-----   1 root       sys         64 0x000007 Dec 3 11:44 /dev/vg00/rlvol7
          crw-r-----   1 root       sys         64 0x000008 Dec 3 11:44 /dev/vg00/rlvol8
          crw-r-----   1 root       sys         64 0x000009 Dec 3 15:10 /dev/vg00/roraclebin
          crw-r-----   1 oracle     dba         64 0x000012 Dec 3 15:10 /dev/vg00/rredo01.log
          crw-r-----   1 oracle     dba         64 0x000013 Dec 3 15:10 /dev/vg00/rredo02.log
          crw-r-----   1 oracle     dba         64 0x000014 Dec 3 15:10 /dev/vg00/rredo03.log
          crw-r-----   1 oracle     dba         64 0x000016 Dec 3 15:10 /dev/vg00/rspfileoracle.ora
          crw-r-----   1 oracle     dba         64 0x000015 Dec 3 15:10 /dev/vg00/rsysaux01.dbf
          crw-r-----   1 oracle     dba         64 0x00000a Dec 3 15:10 /dev/vg00/rsystem01.dbf
          crw-r-----   1 oracle     dba         64 0x00000c Dec 3 15:10 /dev/vg00/rtemp01.dbf
          crw-r-----   1 oracle     dba         64 0x00000d Dec 3 15:10 /dev/vg00/rundotbs01.dbf
          crw-r-----   1 oracle     dba         64 0x00000e Dec 3 15:10 /dev/vg00/rundotbs02.dbf
          crw-r-----   1 oracle     dba         64 0x00000b Dec 3 15:10 /dev/vg00/rusers01.dbf
          14.5 查看鏈接文件的權限和屬組
          /orabin/oradata/oracle
          # ll
          total 0
          lrwxrwxrwx   1 oracle     oinstall        24 Dec 4 11:09 control01.ctl -> /dev/vg00/rcontrol01.ctl
          lrwxrwxrwx   1 oracle     oinstall        24 Dec 4 11:09 control02.ctl -> /dev/vg00/rcontrol02.ctl
          lrwxrwxrwx   1 oracle     oinstall        24 Dec 4 11:09 control03.ctl -> /dev/vg00/rcontrol03.ctl
          lrwxrwxrwx   1 oracle     oinstall        21 Dec 4 11:09 redo01.log -> /dev/vg00/rredo01.log
          lrwxrwxrwx   1 oracle     oinstall        21 Dec 4 11:09 redo02.log -> /dev/vg00/rredo02.log
          lrwxrwxrwx   1 oracle     oinstall        21 Dec 4 11:09 redo03.log -> /dev/vg00/rredo03.log
          lrwxrwxrwx   1 oracle     oinstall        23 Dec 4 11:09 sysaux01.dbf -> /dev/vg00/rsysaux01.dbf
          lrwxrwxrwx   1 oracle     oinstall        23 Dec 4 11:09 system01.dbf -> /dev/vg00/rsystem01.dbf
          lrwxrwxrwx   1 oracle     oinstall        21 Dec 4 11:09 temp01.dbf -> /dev/vg00/rtemp01.dbf
          lrwxrwxrwx   1 oracle     oinstall        24 Dec 4 11:09 undotbs01.dbf -> /dev/vg00/rundotbs01.dbf
          lrwxrwxrwx   1 oracle     oinstall        24 Dec 4 11:09 undotbs02.dbf -> /dev/vg00/rundotbs02.dbf
          lrwxrwxrwx   1 oracle     oinstall        22 Dec 4 11:09 users01.dbf -> /dev/vg00/rusers01.dbf

          根據提示選擇數據庫名(oracle),sys密碼(和主機名一樣),選擇control,datafile,redofile以及spfile的路徑


          15 把數據庫變為歸檔模式

          sqlplus 下執行:
          alter system set log_archive_start= TRUE scope=spfile;
          alter system set log_archive_dest_1="LOCATION=/archive" scope=spfile;
          shutdown immediate;
          alter database archivelog;
          alter database open ;

          show parameter archive;


          測試:
          alter system switch logfile;
          /
          /
          /
          到/archive 目錄下查看是否已經歸檔


          16 用客戶端和網頁或者第三方軟件連接oracle
          測試成功!
          finish!
          archive log list;
          shutdown immediate;
          startup mount;
          alter database archivelog;
          alter database open
          alter system set LOG_ARCHIVE_DEST_1='LOCATION=/oracle/oradata/express/archive';
          shutdown immediate;
          startup
          如果是oracle9i,還需要更改如下參數:
          alter system set log_archive_start=true scope=spfile;
          但是如果在10g中也更改這些參數,數據庫重啟時會有如下提示:
          ORA-32004: obsolete and/or deprecated parameter(s) specified
          alter system set log_archive_format='%t_%s.dbf' scope=spfile;
          但是如果在10g中也更改這些參數,數據庫會不能啟動,如下提示:
          ORA-32004: obsolete and/or deprecated parameter(s) specified
          ORA-19905: log_archive_format must contain %s, %t and %r

          posted @ 2010-12-03 20:45 xzc 閱讀(1114) | 評論 (0)編輯 收藏

          HP--UX查看內存、CPU的使用率

          1、運行/usr/contrib/bin/crashinfo(根據第二步實際情況) | more,信息中注意類似如下內容:
          ==================
          = Memory Globals =
          ==================

          Note: "freemem" was resynced with freemem caches: was 169536, now 168628

          Physical Memory = 2096640 pages (8.00 GB) //物理內存總量
          Free Memory = 168628 pages (658.70 MB)//空閑內存
          Average Free Memory = 169403 pages (661.73 MB)//平均空閑內存
          gpgslim = 7168 pages (28.00 MB)
          lotsfree = 32768 pages (128.00 MB)
          desfree = 7168 pages (28.00 MB)
          minfree = 3328 pages (13.00 MB)
          **************物理內存使用率=(物理內存總量-空閑內存)/物理內存總量***************
          ========================
          = Buffer Cache Globals =
          ========================

          dbc_max_pct = 50 %
          dbc_min_pct = 5 %
          dbc current pct = 50.0 %
          bufpages = 1048320 pages (4.00 GB)
          Number of buf headers = 557940

          fixed_size_cache = 0
          dbc_parolemem = 0
          dbc_stealavg = 0
          dbc_ceiling = 1048320 pages (4.00 GB)
          dbc_nbuf = 52416
          dbc_bufpages = 104832 pages (409.50 MB)
          dbc_vhandcredit = 11403
          orignbuf = 0
          origbufpages = 0 pages

          ====================
          = Swap Information =
          ====================

          swapinfo -mt emulation
          ======================

          Mb Mb Mb PCT START/ Mb
          TYPE AVAIL USED FREE USED LIMIT RESERVE PRI NAME
          dev 16384 0 16098 0% 0 - 1 LVM vg00/lv2
          reserve - 2141 -2141
          memory 6460 4928 1532 76%
          total 22844 7069 15489 31% - 0 -
          *****************SWAP內存使用率就是total的PCT值:31%*************************
          2、CPU的使用率可以從top參數得出:
          System: JXCNMD1 Fri Aug 17 10:25:02 2007
          Load averages: 0.35, 0.41, 0.44
          311 processes: 257 sleeping, 53 running, 1 zombie
          Cpu states:
          CPU LOAD USER NICE SYS IDLE BLOCK SWAIT INTR SSYS
          0 0.74 8.8% 3.8% 2.0% 85.5% 0.0% 0.0% 0.0% 0.0%
          1 0.17 4.4% 6.2% 10.2% 79.3% 0.0% 0.0% 0.0% 0.0%
          2 0.12 3.8% 1.0% 1.0% 94.2% 0.0% 0.0% 0.0% 0.0%
          3 0.36 0.0% 70.9% 28.1% 1.0% 0.0% 0.0% 0.0% 0.0%
          --- ---- ----- ----- ----- ----- ----- ----- ----- -----
          avg 0.35 4.2% 20.6% 10.2% 65.1% 0.0% 0.0% 0.0% 0.0%
          *****************系統一共4個CPU,每個CPU的使用率=100%-IDLE值*******************
          3、top命令的一些解釋
          問:
          top中的幾個參數的意義能幫忙解釋一下嗎?
          主要是對 free的計算方法不太理解,機器的物理內存有256M,free中的33M是怎么計算出來
          的呢?

          Memory: 92764K (15880K) real, 65796K (13316K) virtual, 33684K free Page# 1/5

          另外,SAM中有如下有關信息

          xx x Processor xx Memory xx Operating System xx Network xx Dynamic x x
          xx lqqqqqqqqqqqq/ qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk x
          xx xlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkx x
          xx xxPhysical Memory: 256.2 MB xx x
          xx xxReal Memory: xx x
          xx xx Active: 21113.5 KB xx x
          xx xx Total: 97083.5 KB xx x
          xx xxVirtual Memory: xx x
          xx xx Active: 16247.3 KB xx x
          xx xx Total: 68390.7 KB xx x
          xx xxFree Memory Pages: 6738 at 4 KB/page xx x
          xx xxSwap Space: xx x
          xx xx Avail: 1024 MB xx x
          xx xx Used: 231 MB xxvx
          xmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjx

          其中的Virtual Memory和 Swap Space是什么關系呢?我想計算虛擬內存的利用率該如何計算呢?


          答:
          top 只能看到進程所使用的內存量,所以你看到的 92764K (15880K) real 就是所有進程所使用的內存總和,這個內存是指物理內存,括號前那個值是Total Real Memory,括號內是Active Real Memory, 這兩者的區別就在于Active Real Memory的值只是分配給那些已經在run queue或者正在運行的進程的Real Memory,而Total Real Memory 包括所有的進程。
          對于后一項值 65796K (13316K) virtual 的解釋也是同樣的,不過這個值代表了Virtual Memory(一般為建在Disk上的Swap空間,當然你要問了,我的Swap空間可不止這么些啊 by executing ‘swapinfo‘, 沒錯,Swap空間是大于這里的Total Vitual Memory的,但我前面說了,這里的值只是計算的分配給進程的),最后一項33684K free 到確確實實是Free 的Memory,它等于Physical Mem - kernel used - user used - buffer cache。


          下面是對SAM->;Performance Monitor ->; System Property ->; Memory的顯示結果的解釋

          Physical Memory 256.2 MB 實際物理內存大小
          Real Memory
          Active: 21113.5 KB 同 top (當然這里舉的例子由于有時間差,所以看上去不大一致)
          Total: 97083.5 KB 同 top
          Virtual Memory:
          Active: 16247.3 KB 同 top
          Total: 68390.7 KB 同 top
          Free Memory Pages: 6738 at 4 KB/page 6738 * 4 就是 top 顯示出來的結果
          Swap Space:
          Avail: 1024 MB 同Swapinfo中 dev filesystem 總和(一般不會用到Pseudo Memory),為實際Swap Space 的大小。
          Used: 231 MB 同Swapinfo中的Reserve, 為系統在創建進程時為該進程預留的Swap 空間總和)
          posted @ 2010-12-03 20:43 xzc 閱讀(6611) | 評論 (1)編輯 收藏

          1. 以root用戶修改/etc/lvmrc文件
          對應需要做成共享的VG,先要求關閉其開機自動active的設置。
          你必須保證這些VG在SG啟動的時候激活。
          備份/etc/lvmrc文件
          # cp /etc/lvmrc /etc/lvmrc_orig
          修改/etc/lvmrc文件
          From:
          AUTO_VG_ACTIVATE=1
          To:
          AUTO_VG_ACTIVATE=0


          在文件/etc/lvmrc 中添加custom_vg_activation功能模塊,
          此處為非shared的VG設置。(也可以不做)
          custom_vg_activation()
          {
          # e.g. /sbin/vgchange -a y -s
          # parallel_vg_sync "/dev/vg00 /dev/vg01"
          # parallel_vg_sync "/dev/vg02 /dev/vg03"
          /sbin/vgchange -a y vg00
          /sbin/vgchange -a y vg01
          /sbin/vgchange -a y vg02
          /sbin/vgchange -a y vg03
          return 0
          }

          2.創建共享邏輯卷組
          主節點上:
          # 初始化PV
          pvcreate -f /dev/rdsk/c0t12d0
          # 在/dev目錄添加用于VG的目錄
          mkdir /dev/vg_ops
          # Major number必須為64,minor number是2為16進制數字,作為唯一標識
          mknod /dev/vg_ops/group c 64 0x060000
          # 創建VG
          vgcreate /dev/vg_ops /dev/dsk/c0t12d0
          # 激活VG
          vgchange -a y vg_ops
          # 創建LV
          lvcreate -n P901_control_01.ctl -L 110 /dev/vg_ops
          lvcreate -n P901_control_02.ctl -L 110 /dev/vg_ops
          lvcreate -n P901_control_03.ctl -L 110 /dev/vg_ops
          lvcreate -n P901_system_01.dbf -L 400 /dev/vg_ops
          lvcreate -n P901_log1_01.log -L 120 /dev/vg_ops
          lvcreate -n P901_log1_02.log -L 120 /dev/vg_ops
          lvcreate -n P901_log1_03.log -L 120 /dev/vg_ops
          lvcreate -n P901_log2_01.log -L 120 /dev/vg_ops
          lvcreate -n P901_log2_02.log -L 120 /dev/vg_ops
          lvcreate -n P901_log2_03.log -L 120 /dev/vg_ops
          lvcreate -n P901_spfile1.dbf -L 5 /dev/vg_ops
          lvcreate -n P901_users_01.dbf -L 120 /dev/vg_ops
          lvcreate -n P901_temp_01.dbf -L 100 /dev/vg_ops
          lvcreate -n P901_undotbs_01.dbf -L 312 /dev/vg_ops
          lvcreate -n P901_undotbs_02.dbf -L 312 /dev/vg_ops
          lvcreate -n P901_example_01.dbf -L 160 /dev/vg_ops
          lvcreate -n P901_cwmlite_01.dbf -L 100 /dev/vg_ops
          lvcreate -n P901_indx_01.dbf -L 70 /dev/vg_ops
          lvcreate -n P901_tools_01.dbf -L 20 /dev/vg_ops
          lvcreate -n P901_drsys_01.dbf -L 90 /dev/vg_ops

          # 解除VG的active狀態
          vgchange -a n vg_ops
          # 創建LV的map文件
          vgexport -v -s -p -m /tmp/vg_ops.map /dev/vg_ops
          # 復制map文件到其它節點
          rcp /tmp/vg_ops.map opcbhp2:/tmp/vg_ops.mapOn the other nodes:
          mkdir /dev/vg_ops
          mknod /dev/vg_ops/group c 64 0x060000
          # 在其它節點創建VG和LV
          vgimport -v -s -m /tmp/vg_ops.map /dev/vg_ops
          # 在所有節點配置相應VG和LV的權限和屬主
          # chown oracle:dba /dev/vg_ops/r*
          # remsh nodehp2 chown oracle:dba /dev/vg_ops/r*
          # chmod 777 /dev/vg_ops
          # remsh nodehp2 chmod 777 /dev/vg_ops
          # chmod 660 /dev/vg_ops/r*
          # remsh nodehp2 chmod 660 /dev/vg_ops/r*
          Note: 在創建VG的時候,要注意minor number的唯一性,常用以下命令:
          # find /dev -name group -exec ls -l {} ;
          crw------- 1 root sys 64 0x060000 May 6 07:52 /dev/vg_ops/group
          在該例子中"vg_ops"為"0x060000",所以"0x060000"不能用于創建其它VG,合法的minor numbers的范圍是從"0x010000"到"0xFF0000"。

          3.集群軟件ServiceGuard的安裝
          由供應商安裝,Oracle 10gR2的RAC要求Serviceguard Extension for RAC的版本必須A.11.16.00以上,也包含A.11.16.00版本。
          4.規劃集群環境
          1)配置集群:
          使用cmquerycl去創建一個集群配置文件
          Cmquerycl命令必須在主節點上進行
          # cmquerycl -v -C /etc/cmcluster/cmclconf.ascii -n nodehp1 -n nodehp2
          2)修改集群配置文件
          CLUSTER_NAME # example nodehp
          FIRST_CLUSTER_LOCK # /dev/vg_ops
          FIRST_CLUSTER_PV # /dev/dsk/c0t12d0
          OPS_VOLUME_GROUP # /dev/vg_ops
          DLM_ENABLED # NO
          GMS_ENABLED # NO
          FIRST_CLUSTER_LOCK, FIRST_CLUSTER_PV = 集群lock卷組和磁盤作為表決用途。表決VG和磁盤必須能被所有節點訪問(用共享VG就可以)。一個節點倒掉,會要求表決VG的處理。
          OPS_VOLUME_GROUP = 所有共享VG
          DLM_ENABLED and GMS_ENABLED = NO (8.1.7版本以后均設為NO)
          3)使用cmcheckconf命令驗證集群配置文件
          # cmcheckconf -v -C /etc/cmcluster/cmclconf.ascii
          4)使用vgchange來激活lock卷組
          # vgchange -a y vg_ops
          5)使用cmapplyconf復制集群配置文件到所有節點
          # cmapplyconf -v -C /etc/cmcluster/cmclconf.ascii
          6)使用vgchange解除lock卷組的激活狀態
          # vgchange -a n vg_ops

          5.基本集群管理
          1)啟動集群:
          # cmruncl
          2)使用vgchange在主節點設置共享VG
          # vgchange -S y -c y vg_ops
          3)使用vgchange在每個節點激活共享VG
          # vgchange -a s vg_ops
          # remsh nodehp2 /usr/sbin/vgchange -a s vg_ops
          4)使用cmhaltcl關閉集群或者使用cmhaltnode從集群移除節點
          # cmhaltnode
          5)使用cmrunnode添加節點到集群
          # cmrunnode
          6)使用cmhaltpkg,cmrunpkg及cmmodpkg管理集群的pkg,也可用于集群節點的恢復,可參照在線手冊使用。

          6.Log Files for Cluster
          /var/adm/syslog/syslog.log包含HP Serviceguard Extension for RAC的系統信息

          posted @ 2010-12-01 20:22 xzc 閱讀(414) | 評論 (0)編輯 收藏

          “SQL TRACE”是Oracle提供的用于進行SQL跟蹤的手段,是強有力的輔助診斷工具。在日常的數據庫問題診斷和解決中,“SQL TRACE”是非常常用的方法。

          一般,一次跟蹤可以分為以下幾步:

          1、界定需要跟蹤的目標范圍,并使用適當的命令啟用所需跟蹤。

           

          2、經過一段時間后,停止跟蹤。此時應該產生了一個跟蹤結果文件。

           

          3、找到跟蹤文件,并對其進行格式化,然后閱讀或分析。

           

          本文就“SQL TRACE”的這些使用作簡單探討,并通過具體案例對SQL_TRACE的使用進行說明。

           

          一、“SQL TRACE”的啟用。

          (A)SQL_TRACE說明

          SQL_TRACE可以作為初始化參數在全局啟用,也可以通過命令行方式在具體session啟用。

           

          1在全局啟用

          在參數文件(pfile/spfile)中指定: SQL_TRACE = true

             在全局啟用SQL_TRACE會導致所有進程的活動被跟蹤,包括后臺進程及所有用戶進程,這通常會導致比較嚴重的性能問題,所以在生產環境中要謹慎使用。

          提示: 通過在全局啟用SQL_TRACE,我們可以跟蹤到所有后臺進程的活動,很多在文檔中的抽象說明,通過跟蹤文件的實時變化,我們可以清晰的看到各個進程之間的緊密協調。

           

          2在當前session級設置

          大多數時候我們使用SQL_TRACE跟蹤當前會話的進程。通過跟蹤當前進程可以發現當前操作的后臺數據庫遞歸活動(這在研究數據庫新特性時尤其有效),研究SQL執行,發現后臺錯誤等。

          在session級啟用和停止SQL_TRACE方式如下:

          啟用當前session的跟蹤:

          SQL> alter session set SQL_TRACE=true;

          Session altered.

           

          此時的SQL操作將被跟蹤:

           

          SQL> select count(*) from dba_users;

           

           COUNT(*)

          ----------

                 34

           

          結束跟蹤:

          SQL> alter session set SQL_TRACE=false;

          Session altered.

           

          3跟蹤其它用戶進程

             在很多時候我們需要跟蹤其他用戶的進程,而不是當前用戶,這可以通過Oracle提供的系統包DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION來完成

          通過v$session我們可以獲得sid、serial#等信息:

          獲得進程信息,選擇需要跟蹤的進程:

          SQL> select sid,serial#,username from v$session where username =’***’

           

                SID   SERIAL# USERNAME

          ---------- ---------- ------------------------------

                       2041 SYS

                        437 EYGLE

          設置跟蹤:

          SQL> exec dbms_system.set_SQL_TRACE_in_session(9,437,true)

          PL/SQL procedure successfully completed.

          ….

          可以等候片刻,跟蹤session執行任務,捕獲sql操作…

          ….

          停止跟蹤:

          SQL> exec dbms_system.set_SQL_TRACE_in_session(9,437,false)

          PL/SQL procedure successfully completed.

           

          (B) 10046事件說明

          10046事件是Oracle提供的內部事件,是對SQL_TRACE的增強.

          10046事件可以設置以下四個級別:

          1 - 啟用標準的SQL_TRACE功能,等價于SQL_TRACE。

          4 - Level 1 加上綁定值(bind values)

          8 - Level 1 + 等待事件跟蹤

          12 - Level 1 + Level 4 + Level 8

           

          類似SQL_TRACE方法,10046事件可以在全局設置,也可以在session級設置。

          對于10046事件的設置,涉及到了oracle的“診斷事件”的概念。

           

          可以參考以下鏈接了解詳情。http://www.itpub.net/323537,1.html 

          1. 在全局設置

          在參數文件中增加:

          EVENT="10046 trace name context forever,level 12"

          此設置對所有用戶的所有進程生效、包括后臺進程.

           

          2. 對當前session設置

          通過alter session的方式修改,需要alter session的系統權限:

          SQL> alter session set events '10046 trace name context forever';

          Session altered.

           

          SQL> alter session set events '10046 trace name context forever, level 8';

          Session altered.

           

          SQL> alter session set events '10046 trace name context off';

          Session altered.

           

          3. 對其他用戶session設置

          通過DBMS_SYSTEM.SET_EV系統包來實現:

           

          SQL> desc DBMS_SYSTEM.SET_EV;

           

          Parameter Type          Mode Default?

          --------- -------------- ---- --------

          SI       BINARY_INTEGER IN           

          SE       BINARY_INTEGER IN           

          EV       BINARY_INTEGER IN           

          LE       BINARY_INTEGER IN           

          NM       VARCHAR2      IN  

          其中的參數SI、SE來自v$session視圖:

          查詢獲得需要跟蹤的session信息:

          SQL> select sid,serial#,username from v$session where username is not null;

          SID SERIAL# USERNAME

          ---------- ---------- ------------------------------

          8 2041 SYS

          9 437 EYGLE

           

          執行跟蹤:

          SQL> exec dbms_system.set_ev(9,437,10046,8,'eygle');

          PL/SQL procedure successfully completed.

           

          結束跟蹤:

          SQL> exec dbms_system.set_ev(9,437,10046,0,'eygle');

          PL/SQL procedure successfully completed.

           

          (C)對啟用方法的一些總結。

          因為trace的目標范圍不同,導致必須使用不同的方法。

          ?nbsp;       作用于數據庫全局的,就改初始化參數。

          ?nbsp;       只作用于本session的,就用alter session 命令。

          ?nbsp;       作用于其它session的,就用DBMS_SYSTEM包。

           

          再加上10046診斷事件,是SQL_TRACE的增強,又多了一套方法。

           

          二、獲取跟蹤文件

          以上生成的跟蹤文件位于“user_dump_dest”參數所指定的目錄中,位置及文件名可以通過以下SQL查詢獲得:

          1.如果是查詢當前session的跟蹤文件,使用如下查詢:

          SELECT d.value||'/'||lower(rtrim(i.instance, chr(0)))||'_ora_'||p.spid||'.trc' trace_file_name 

          from 

             ( select p.spid from v$mystat m,v$session s, v$process p 

               where m.statistic# = 1 and s.sid = m.sid and p.addr = s.paddr) p, 

             ( select t.instance from v$thread t,v$parameter 

               where v.name = 'thread' and (v.value = 0 or t.thread# = to_number(v.value))) i, 

             ( select value from v$parameter where name = 'user_dump_dest') d

           

          TRACE_FILE_NAME

          -------------------------------------------------------------------------------

          D:\ORACLE\PRODUCT\10.2.0\ADMIN\MYORACLE\UDUMP\hsjf_ora_1026.trc

           

          2.如果是查詢其他用戶session的跟蹤文件,則根據用戶的sid和#serial使用如下查詢:

          SELECT d.value||'/'||lower(rtrim(i.instance, chr(0)))||'_ora_'||p.spid||'.trc' trace_file_name 

          from 

             ( select p.spid from v$session s, v$process p 

               where s.sid=’’ and s. SERIAL#='' and p.addr = s.paddr) p, 

             ( select t.instance from v$thread t,v$parameter 

               where v.name = 'thread' and (v.value = 0 or t.thread# = to_number(v.value))) i, 

             ( select value from v$parameter where name = 'user_dump_dest') d

           

          TRACE_FILE_NAME

          -------------------------------------------------------------------------------

          D:\ORACLE\PRODUCT\10.2.0\ADMIN\MYORACLE\UDUMP\hsjf_ora_1026.trc

           

          三、格式化跟蹤文件。

          原始的跟蹤文件是很難讀懂的。需要使用oracle自帶的tkprof命令行工具格式化一下。

          SQL>$tkprof D:\ORACLE\PRODUCT\10.2.0\ADMIN\MYORACLE\UDUMP\hsjf_ora_1026.trc D:\ORACLE\PRODUCT\10.2.0\ADMIN\MYORACLE\UDUMP\hsjf_ora_1026.txt

          這個就可以方便的閱讀了。可以在hsjf_ora_1026.txt文件中看到所有的sql語句執行次數,CPU使用時間等數據。

           

          備注:可以通過以下方法讀取當前已經設置的參數

          對于全局的SQL_TRACE參數的設置,可以通過show parameter命令獲得。

           

          當我們通過alter session的方式設置了SQL_TRACE,這個設置是不能通過show parameter的方式得到的,我們需要通過dbms_system.read_ev來獲取:

          SQL> set feedback off

          SQL> set serveroutput on

          SQL> declare

          2 event_level number;

          3 begin

          4 for event_number in 10000..10999 loop

          5 sys.dbms_system.read_ev(event_number, event_level);

          6 if (event_level > 0) then

          7 sys.dbms_output.put_line(

          8 'Event ' ||

          9 to_char(event_number) ||

          10 ' is set at level ' ||

          11 to_char(event_level)

          12 );

          13 end if;

          14 end loop;

          15 end;

          16 /

          Event 10046 is set at level 1

          引用:http://blog.sina.com.cn/s/blog_4cae4a25010008do.html

          posted @ 2010-11-13 14:31 xzc 閱讀(8629) | 評論 (2)編輯 收藏

          寫HINT目的

            手工指定SQL語句的執行計劃

            hints是oracle提供的一種機制,用來告訴優化器按照我們的告訴它的方式生成執行計劃。我們可以用hints來實現:

            1) 使用的優化器的類型

            2) 基于代價的優化器的優化目標,是all_rows還是first_rows。

            3) 表的訪問路徑,是全表掃描,還是索引掃描,還是直接利用rowid。

            4) 表之間的連接類型

            5) 表之間的連接順序

            6) 語句的并行程度

            2、HINT可以基于以下規則產生作用

            表連接的順序、表連接的方法、訪問路徑、并行度

            3、HINT應用范圍

            dml語句

            查詢語句

            4、語法

            {DELETE|INSERT|SELECT|UPDATE} /*+ hint [text] [hint[text]]... */

            or

            {DELETE|INSERT|SELECT|UPDATE} --+ hint [text] [hint[text]]...

            如果語(句)法不對,則ORACLE會自動忽略所寫的HINT,不報錯

            1. /*+ALL_ROWS*/

            表明對語句塊選擇基于開銷的優化方法,并獲得最佳吞吐量,使資源消耗最小化.

            例如:

            SELECT /*+ALL_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';

            2. /*+FIRST_ROWS*/

            表明對語句塊選擇基于開銷的優化方法,并獲得最佳響應時間,使資源消耗最小化.

            例如:

            SELECT /*+FIRST_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';

            3. /*+CHOOSE*/

            表明如果數據字典中有訪問表的統計信息,將基于開銷的優化方法,并獲得最佳的吞吐量;

            表明如果數據字典中沒有訪問表的統計信息,將基于規則開銷的優化方法;

            例如:

            SELECT /*+CHOOSE*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';

            4. /*+RULE*/

            表明對語句塊選擇基于規則的優化方法.

            例如:

            SELECT /*+ RULE */ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';

            5. /*+FULL(TABLE)*/

            表明對表選擇全局掃描的方法.

            例如:

            SELECT /*+FULL(A)*/ EMP_NO,EMP_NAM FROM BSEMPMS A WHERE EMP_NO='SCOTT';

            6. /*+ROWID(TABLE)*/

            提示明確表明對指定表根據ROWID進行訪問.

            例如:

            SELECT /*+ROWID(BSEMPMS)*/ * FROM BSEMPMS WHERE ROWID>='AAAAAAAAAAAAAA'

            AND EMP_NO='SCOTT';

            7. /*+CLUSTER(TABLE)*/

            提示明確表明對指定表選擇簇掃描的訪問方法,它只對簇對象有效.

            例如:

            SELECT /*+CLUSTER */ BSEMPMS.EMP_NO,DPT_NO FROM BSEMPMS,BSDPTMS

            WHERE DPT_NO='TEC304' AND BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;

            8. /*+INDEX(TABLE INDEX_NAME)*/

            表明對表選擇索引的掃描方法.

            例如:

            SELECT /*+INDEX(BSEMPMS SEX_INDEX) USE SEX_INDEX BECAUSE THERE ARE FEWMALE BSEMPMS */ FROM BSEMPMS WHERE SEX='M';

            9. /*+INDEX_ASC(TABLE INDEX_NAME)*/

            表明對表選擇索引升序的掃描方法.

            例如:

            SELECT /*+INDEX_ASC(BSEMPMS PK_BSEMPMS) */ FROM BSEMPMS WHERE DPT_NO='SCOTT';

            10. /*+INDEX_COMBINE*/

            為指定表選擇位圖訪問路經,如果INDEX_COMBINE中沒有提供作為參數的索引,將選擇出位圖索引的布爾組合方式.

            例如:

            SELECT /*+INDEX_COMBINE(BSEMPMS SAL_BMI HIREDATE_BMI)*/ * FROM BSEMPMS

            WHERE SAL<5000000 AND HIREDATE

            11. /*+INDEX_JOIN(TABLE INDEX_NAME)*/

            提示明確命令優化器使用索引作為訪問路徑.

            例如:

            SELECT /*+INDEX_JOIN(BSEMPMS SAL_HMI HIREDATE_BMI)*/ SAL,HIREDATE

            FROM BSEMPMS WHERE SAL<60000;

            12. /*+INDEX_DESC(TABLE INDEX_NAME)*/

            表明對表選擇索引降序的掃描方法.

            例如:

            SELECT /*+INDEX_DESC(BSEMPMS PK_BSEMPMS) */ FROM BSEMPMS WHERE DPT_NO='SCOTT';

            13. /*+INDEX_FFS(TABLE INDEX_NAME)*/

            對指定的表執行快速全索引掃描,而不是全表掃描的辦法.

            例如:

            SELECT /*+INDEX_FFS(BSEMPMS IN_EMPNAM)*/ * FROM BSEMPMS WHERE DPT_NO='TEC305';

            14. /*+ADD_EQUAL TABLE INDEX_NAM1,INDEX_NAM2,...*/

            提示明確進行執行規劃的選擇,將幾個單列索引的掃描合起來.

            例如:

            SELECT /*+INDEX_FFS(BSEMPMS IN_DPTNO,IN_EMPNO,IN_SEX)*/ * FROM BSEMPMS WHERE EMP_NO='SCOTT' AND DPT_NO='TDC306';

            15. /*+USE_CONCAT*/

            對查詢中的WHERE后面的OR條件進行轉換為UNION ALL的組合查詢.

            例如:

            SELECT /*+USE_CONCAT*/ * FROM BSEMPMS WHERE DPT_NO='TDC506' AND SEX='M';

            16. /*+NO_EXPAND*/

            對于WHERE后面的OR 或者IN-LIST的查詢語句,NO_EXPAND將阻止其基于優化器對其進行擴展.

            例如:

            SELECT /*+NO_EXPAND*/ * FROM BSEMPMS WHERE DPT_NO='TDC506' AND SEX='M';

            17. /*+NOWRITE*/

            禁止對查詢塊的查詢重寫操作.

            18. /*+REWRITE*/

            可以將視圖作為參數.

            19. /*+MERGE(TABLE)*/

            能夠對視圖的各個查詢進行相應的合并.

            例如:

            SELECT /*+MERGE(V) */ A.EMP_NO,A.EMP_NAM,B.DPT_NO FROM BSEMPMS A (SELET DPT_NO

            ,AVG(SAL) AS AVG_SAL FROM BSEMPMS B GROUP BY DPT_NO) V WHERE A.DPT_NO=V.DPT_NO

            AND A.SAL>V.AVG_SAL;

            20. /*+NO_MERGE(TABLE)*/

            對于有可合并的視圖不再合并.

            例如:

            SELECT /*+NO_MERGE(V) */ A.EMP_NO,A.EMP_NAM,B.DPT_NO FROM BSEMPMS A (SELECT DPT_NO,AVG(SAL) AS AVG_SAL FROM BSEMPMS B GROUP BY DPT_NO) V WHERE A.DPT_NO=V.DPT_NO AND A.SAL>V.AVG_SAL;

            21. /*+ORDERED*/

            根據表出現在FROM中的順序,ORDERED使ORACLE依此順序對其連接.

            例如:

            SELECT /*+ORDERED*/ A.COL1,B.COL2,C.COL3 FROM TABLE1 A,TABLE2 B,TABLE3 C WHERE A.COL1=B.COL1 AND B.COL1=C.COL1;

            22. /*+USE_NL(TABLE)*/

            將指定表與嵌套的連接的行源進行連接,并把指定表作為內部表.

            例如:

            SELECT /*+ORDERED USE_NL(BSEMPMS)*/ BSDPTMS.DPT_NO,BSEMPMS.EMP_NO,BSEMPMS.EMP_NAM FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;

            23. /*+USE_MERGE(TABLE)*/

            將指定的表與其他行源通過合并排序連接方式連接起來.

            例如:

            SELECT /*+USE_MERGE(BSEMPMS,BSDPTMS)*/ * FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;

            24. /*+USE_HASH(TABLE)*/

            將指定的表與其他行源通過哈希連接方式連接起來.

            例如:

            SELECT /*+USE_HASH(BSEMPMS,BSDPTMS)*/ * FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;

            25. /*+DRIVING_SITE(TABLE)*/

            強制與ORACLE所選擇的位置不同的表進行查詢執行.

            例如:

            SELECT /*+DRIVING_SITE(DEPT)*/ * FROM BSEMPMS,DEPT@BSDPTMS WHERE BSEMPMS.DPT_NO=DEPT.DPT_NO;

            26. /*+LEADING(TABLE)*/

            將指定的表作為連接次序中的首表.

            27. /*+CACHE(TABLE)*/

            當進行全表掃描時,CACHE提示能夠將表的檢索塊放置在緩沖區緩存中最近最少列表LRU的最近使用端

            例如:

            SELECT /*+FULL(BSEMPMS) CAHE(BSEMPMS) */ EMP_NAM FROM BSEMPMS;

            28. /*+NOCACHE(TABLE)*/

            當進行全表掃描時,CACHE提示能夠將表的檢索塊放置在緩沖區緩存中最近最少列表LRU的最近使用端

            例如:

            SELECT /*+FULL(BSEMPMS) NOCAHE(BSEMPMS) */ EMP_NAM FROM BSEMPMS;

            29. /*+APPEND*/

            直接插入到表的最后,可以提高速度.

            insert /*+append*/ into test1 select * from test4 ;

            30. /*+NOAPPEND*/

            通過在插入語句生存期內停止并行模式來啟動常規插入.

            insert /*+noappend*/ into test1 select * from test4 ;

            31. NO_INDEX: 指定不使用哪些索引

            /*+ NO_INDEX ( table [index [index]...] ) */

            select /*+ no_index(emp ind_emp_sal ind_emp_deptno)*/ * from emp where deptno=200 and sal>300;

            32. parallel

            select /*+ parallel(emp,4)*/ * from emp where deptno=200 and sal>300;

            另:每個SELECT/INSERT/UPDATE/DELETE命令后只能有一個/*+ */,但提示內容可以有多個,可以用逗號分開,空格也可以。

            如:/*+ ordered index() use_nl() */

          ---------
          類似如下的一條語句:insert into xxxx select /*+parallel(a) */ * from xxx a;數據量大約在75G左右,這位兄弟從上午跑到下午還沒跑完,過來問我咋回事,說平常2hrs能跑完的東西跑了好幾個小時還撒動靜。查看系統性能也比較 正常,cpu,io都不繁忙,平均READ速度在80M/s左右(勉強湊合),但平均寫速度只有10M不到。等待事件里面大量的‘ ‘PX Deq Credit: send blkd’,這里能看出并行出了問題,從而最后得知是并行用法有問題,修改之后20分鐘完成了該操作。正確的做法應該是:
          alter session enable dml parallel;

          insert /*+parallel(xxxx,4) */ into xxxx select /*+parallel(a) */ * from xxx a;

          因為oracle默認并不會打開PDML,對DML語句必須手工啟用。 另外不得不說的是,并行不是一個可擴展的特性,只有在數據倉庫或作為DBA等少數人的工具在批量數據操作時利于充分利用資源,而在OLTP環境下使用并行 需要非常謹慎。事實上PDML還是有比較多的限制的,例如不支持觸發器,引用約束,高級復制和分布式事務等特性,同時也會帶來額外的空間占用,PDDL同 樣是如此。有關Parallel excution可參考官方文檔,在Thomas Kyte的新書《Expert Oracle Database architecture》也有精辟的講述。
          ---------
          select count(*)
            From wid_serv_prod_mon_1100 a
           where a.acct_month = 201010
             and a.partition_id = 10
             and serv_state not in ('2HB', '2HL', '2HJ', '2HP', '2HF')
             and online_flag in (0)
             and incr_product_id in (2000020)
             and product_id in (2020966, 2020972, 2100297, 2021116)
             and billing_mode_id = 1
             and exp_date > to_date('201010', 'yyyymm')
             and not exists (select /*+no_index (b IDX_W_CDR_MON_SERV_ID_1100)*/
                   1
                    from wid_cdr_mon_1100 b
                   where b.acct_month = 201010
                     and b.ANA_EVENT_TYPE_4 in
                         ('10201010201', '10202010201', '10203010201', '10203010202', '10203030201', '10203030202', '10204010201', '10204010202', '10204030201')
                     and a.serv_id = b.serv_id)

          posted @ 2010-11-05 18:02 xzc 閱讀(753) | 評論 (0)編輯 收藏
          僅列出標題
          共32頁: First 上一頁 10 11 12 13 14 15 16 17 18 下一頁 Last 
          主站蜘蛛池模板: 德江县| 苗栗市| 鄂托克前旗| 玉田县| 类乌齐县| 通城县| 镶黄旗| 抚顺市| 莱州市| 钟山县| 延边| 太白县| 黔东| 丁青县| 禄劝| 道孚县| 弥渡县| 饶平县| 政和县| 黑河市| 武川县| 蓝田县| 宜兴市| 都匀市| 永兴县| 沈阳市| 保康县| 墨江| 夏邑县| 白沙| 永城市| 湄潭县| 斗六市| 黑山县| 天柱县| 府谷县| 旬阳县| 富川| 班玛县| 平罗县| 永登县|