gdufo

           

          學習動態性能表 第七篇--V$PROCESS 2007.5.30

               摘要:   本視圖包含當前系統oracle運行的所有進程信息。常被用于將oracle或服務進程的操作系統進程ID與數據庫session之間建立聯系。在某些情況下非常有用:   1.         如果數據庫瓶頸是系統資源(如:cpu,內存),并且占用資源最多的用戶總是停留在某幾個服務進程,那么進行如...  閱讀全文

          posted @ 2009-11-17 14:31 gdufo| 編輯 收藏

          學習動態性能表 第六篇-(1)-V$SESSION_WAIT 2007.5.30

               摘要:   這是一個尋找性能瓶頸的關鍵視圖。它提供了任何情況下session在數據庫中當前正在等待什么(如果session當前什么也沒在做,則顯示它最后的等待事件)。當系統存在性能問題時,本視圖可以做為一個起點指明探尋問題的方向。     V$SESSION_WAIT中,每一個連接到實例的session都對應一條記錄。   V$SESSION_WAIT中的常用列 ...  閱讀全文

          posted @ 2009-11-17 14:28 gdufo| 編輯 收藏

          學習動態性能表 第五篇--V$SESSION 2007.5.29

           

           在本視圖中,每一個連接到數據庫實例中的session都擁有一條記錄。包括用戶session及后臺進程如DBWRLGWRarcchiver等等。

           

          V$SESSION中的常用列

           

          V$SESSION是基礎信息視圖,用于找尋用戶SIDSADDR。不過,它也有一些列會動態的變化,可用于檢查用戶。如例:

          SQL_HASH_VALUESQL_ADDRESS:這兩列用于鑒別默認被session執行的SQL語句。如果為null0,那就說明這個session沒有執行任何SQL語句。PREV_HASH_VALUEPREV_ADDRESS兩列用來鑒別被session執行的上一條語句。

           

          注意:當使用SQL*Plus進行選擇時,確認你重定義的列寬不小于11以便看到完整的數值。

           

          STATUS:這列用來判斷session狀態是:

          l         Achtive:正執行SQL語句(waiting for/using a resource)

          l         Inactive:等待操作(即等待需要執行的SQL語句)

          l         Killed:被標注為刪除

           

          下列各列提供session的信息,可被用于當一個或多個combination未知時找到session

           

          Session信息

          l         SIDSESSION標識,常用于連接其它列

          l         SERIAL#:如果某個SID又被其它的session使用的話則此數值自增加(當一個        SESSION結束,另一個SESSION開始并使用了同一個SID)

          l         AUDSID:審查session ID唯一性,確認它通常也用于當尋找并行查詢模式

          l         USERNAME:當前sessionoracle中的用戶名。

           

          Client信息

          數據庫session被一個運行在數據庫服務器上或從中間服務器甚至桌面通過SQL*Net連接到數據庫的客戶端進程啟動,下列各列提供這個客戶端的信息

          l         OSUSER:客戶端操作系統用戶名

          l         MACHINE:客戶端執行的機器

          l         TERMINAL:客戶端運行的終端

          l         PROCESS:客戶端進程的ID

          l         PROGRAM:客戶端執行的客戶端程序

          要顯示用戶所連接PC TERMINALOSUSER,需在該PCORACLE.INIWindows中設置關鍵字TERMINALUSERNAME

           

          Application信息

          調用DBMS_APPLICATION_INFO包以設置一些信息區分用戶。這將顯示下列各列。

          l         CLIENT_INFODBMS_APPLICATION_INFO中設置

          l         ACTIONDBMS_APPLICATION_INFO中設置

          l         MODULEDBMS_APPLICATION_INFO中設置

          下列V$SESSION列同樣可能會被用到:

          l         ROW_WAIT_OBJ#

          l         ROW_WAIT_FILE#

          l         ROW_WAIT_BLOCK#

          l         ROW_WAIT_ROW#

           

          V$SESSION中的連接列

           

          Column                                                            View                                               Joined Column(s)

          SID             V$SESSION_WAIT,,V$SESSTAT,,V$LOCK,V$SESSION_EVENT,V$OPEN_CURSOR                 SID

          (SQL_HASH_VALUE, SQL_ADDRESS)                  V$SQLTEXT, V$SQLAREA, V$SQL    (HASH_VALUE, ADDRESS)

          (PREV_HASH_VALUE, PREV_SQL_ADDRESS)     V$SQLTEXT, V$SQLAREA, V$SQL    (HASH_VALUE, ADDRESS)

          TADDR                                                             V$TRANSACTION                                    ADDR

          PADDR                                                              V$PROCESS                                             ADDR

           

           

          示例:

          1.查找你的session信息

          SELECT SID, OSUSER, USERNAME, MACHINE, PROCESS

            FROM V$SESSION WHERE audsid = userenv('SESSIONID');

           

          2.machine已知的情況下查找session

          SELECT SID, OSUSER, USERNAME, MACHINE, TERMINAL

            FROM V$SESSION

           WHERE terminal = 'pts/tl' AND machine = 'rgmdbs1';

           

          3.查找當前被某個指定session正在運行的sql語句。假設sessionID100

          select b.sql_text

            from v$session a,v$sqlarea b

            where a.sql_hash_value=b.hash_value and a.sid=100

          尋找被指定session執行的SQL語句是一個公共需求,如果session是瓶頸的主要原因,那根據其當前在執行的語句可以查看session在做些什么。

           

          posted @ 2009-11-17 11:53 gdufo| 編輯 收藏

          學習動態性能表 第四篇-(1)-V$SQLTEXT 2007.5.29

           

          本視圖包括Shared poolSQL語句的完整文本,一條SQL語句可能分成多個塊被保存于多個記錄內。

            注:V$SQLAREA只包括頭1000個字符。

           

          V$SQLTEXT中的常用列

           

          l         HASH_VALUESQL語句的Hash

          l         ADDRESSsql語句在SGA中的地址

          l         SQL_TEXTSQL文本。

          l         PIECESQL語句塊的序號

           

          V$SQLTEXT中的連接列

          Column                                          View                                     Joined Column(s)

          HASH_VALUE, ADDRESS          V$SQL, V$SESSION            HASH_VALUE, ADDRESS

          HASH_VALUE. ADDRESS          V$SESSION                          SQL_HASH_VALUE, SQL_ADDRESS

           

          示例:已知hash_value:3111103299,查詢sql語句:

          select * from v$sqltext

          where hash_value='3111103299'

          order by piece

           

           

          第四篇-(2)-V$SQLAREA  2007.5.29

           

            本視圖持續跟蹤所有shared pool中的共享cursor,在shared pool中的每一條SQL語句都對應一列。本視圖在分析SQL語句資源使用方面非常重要。

           

          V$SQLAREA中的信息列

           

          l         HASH_VALUESQL語句的Hash值。

          l         ADDRESSSQL語句在SGA中的地址。

          這兩列被用于鑒別SQL語句,有時,兩條不同的語句可能hash值相同。這時候,必須連同ADDRESS一同使用來確認SQL語句。

          l         PARSING_USER_ID:為語句解析第一條CURSOR的用戶

          l         VERSION_COUNT:語句cursor的數量

          l         KEPT_VERSIONS

          l         SHARABLE_MEMORYcursor使用的共享內存總數

          l         PERSISTENT_MEMORYcursor使用的常駐內存總數

          l         RUNTIME_MEMORYcursor使用的運行時內存總數。

          l         SQL_TEXTSQL語句的文本(最大只能保存該語句的前1000個字符)。

          l         MODULE,ACTION:使用了DBMS_APPLICATION_INFOsession解析第一條cursor時的信息

           

          V$SQLAREA中的其它常用列

           

          l         SORTS: 語句的排序數

          l         CPU_TIME: 語句被解析和執行的CPU時間

          l         ELAPSED_TIME: 語句被解析和執行的共用時間

          l         PARSE_CALLS: 語句的解析調用(軟、硬)次數

          l         EXECUTIONS: 語句的執行次數

          l         INVALIDATIONS: 語句的cursor失效次數

          l         LOADS: 語句載入(載出)數量

          l         ROWS_PROCESSED: 語句返回的列總數

           

          V$SQLAREA中的連接列

          Column                                          View                                                                Joined Column(s)

          HASH_VALUE, ADDRESS          V$SESSION                                                     SQL_HASH_VALUE, SQL_ADDRESS

          HASH_VALUE, ADDRESS          V$SQLTEXT, V$SQL, V$OPEN_CURSOR   HASH_VALUE, ADDRESS

          SQL_TEXT                                   V$DB_OBJECT_CACHE                               NAME

           

          示例:

          1.查看消耗資源最多的SQL

          SELECT hash_value, executions, buffer_gets, disk_reads, parse_calls

            FROM V$SQLAREA

           WHERE buffer_gets > 10000000 OR disk_reads > 1000000

           ORDER BY buffer_gets + 100 * disk_reads DESC;

           

          2.查看某條SQL語句的資源消耗:

          SELECT hash_value, buffer_gets, disk_reads, executions, parse_calls

            FROM V$SQLAREA

           WHERE hash_Value = 228801498 AND address = hextoraw('CBD8E4B0');

          posted @ 2009-11-17 11:44 gdufo| 編輯 收藏

          學習動態性能表 第三篇-(1)-v$sql 2007.5.25

               摘要:   V$SQL中存儲具體的SQL語句。     一條語句可以映射多個cursor,因為對象所指的cursor可以有不同用戶(如例1)。如果有多個cursor(子游標)存在,在V$SQLAREA為所有cursor提供集合信息。 例1: 這里介紹以下child cursor user A: select * from tbl user B: select * ...  閱讀全文

          posted @ 2009-11-17 11:42 gdufo| 編輯 收藏

          學習動態性能表 第二篇--v$sesstat 2007.5.25

           

          按照OracleOnlineBook中的描述,v$sesstat存儲sessionloginlogout的詳細資源使用統計。

           

            類似于v$sysstat,該視圖存儲下列類別的統計:

           

          l         事件發生次數的統計,如用戶提交數。

          l         數據產生,存取或者操作的total(如:redo size)

          l         執行操作所花費的時間累積,例如session CPU占用(如果TIMED_STATISTICS值為true)

          注意:

          如果初始參數STATISTICS_LEVEL被設置為TYPICALALL,時間統計被數據庫自動收集如果STATISTICS_LEVEL被設置為BASIC,你必須設置TIMED_STATISTICS值為TRUE以打開收集功能。

           

          如果你已設置了DB_CACHE_ADVICE,TIMED_STATISTICSTIMED_OS_STATISTICS,或在初始參數文件或使用ALTER_SYSTEMALTER SESSION,那么你所設定的值的值將覆蓋STATISTICS_LEVEL的值。

           

          v$sysstatv$sesstat差別如下:

          n         v$sesstat只保存session數據,而v$sysstat則保存所有sessions的累積值。

          n         v$sesstat只是暫存數據,session退出后數據即清空。v$sysstat則是累積的,只有當實例被shutdown才會清空。

          n         v$sesstat不包括統計項名稱,如果要獲得統計項名稱則必須與v$sysstatv$statname連接查詢獲得。

           

          v$sesstat可被用于找出如下類型session

          n         高資源占用

          n         高平均資源占用比(登陸后資源使用率)

          n         默認資源占用比(兩快照之間)

           

          V$SESSTAT中使用統計

            多數v$sesstat中的統計參考是v$sysstat描述的子集,包括session logical reads, CPU used by this session, db block changes, redo size, physical writes, parse count (hard), parse count (total), sorts (memory), and sorts (disk).

           

          V$SESSTAT常用列說明

          n         SIDsession唯一ID

          n         STATISTIC#:資源唯一ID

          n         VALUE:資源使用

           

           

          示例1:下列找出當前session中最高的logicalPhysical I/O比率.

           

            下列SQL語句顯示了所有連接到數據庫的session邏輯、物理讀比率(每秒)logicalphysical I/O比率是通過自登陸后的時間消耗計算得出。對于sessions連接到數據庫這種長周期操作而言也許不夠精確,不過做個示例卻足夠了。

           

          先獲得session邏輯讀和物理讀統計項的STATISTIC#值:

          SELECT name, statistic#

            FROM V$STATNAME

            WHERE name IN ('session logical reads','physical reads') ;

          NAME                           STATISTIC#

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

          session logical reads                   9

          physical reads                         40

           

          通過上面獲得的STATISTIC#值執行下列語句:

           

          SELECT ses.sid

               , DECODE(ses.action,NULL,'online','batch')          "User"

               , MAX(DECODE(sta.statistic#,9,sta.value,0))

                 /greatest(3600*24*(sysdate-ses.logon_time),1)     "Log IO/s"

               , MAX(DECODE(sta.statistic#,40,sta.value,0))

                 /greatest(3600*24*(sysdate-ses.logon_time),1)     "Phy IO/s"

               , 60*24*(sysdate-ses.logon_time)                    "Minutes"

           FROM V$SESSION ses

              , V$SESSTAT sta

          WHERE ses.status     = 'ACTIVE'

            AND sta.sid        = ses.sid

            AND sta.statistic# IN (9,40)

          GROUP BY ses.sid, ses.action, ses.logon_time

          ORDER BY

                  SUM( DECODE(sta.statistic#,40,100*sta.value,sta.value) )

                / greatest(3600*24*(sysdate-ses.logon_time),1)  DESC;

           

            SID User   Log IO/s Phy IO/s Minutes

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

           1951 batch       291    257.3       1

            470 online    6,161     62.9       0

            730 batch     7,568     43.2     197

           2153 online    1,482     98.9      10

           2386 batch     7,620     35.6      35

           1815 batch     7,503     35.5      26

           1965 online    4,879     42.9      19

           1668 online    4,318     44.5       1

           1142 online      955     69.2      35

           1855 batch       573     70.5       8

           1971 online    1,138     56.6       1

           1323 online    3,263     32.4       5

           1479 batch     2,857     35.1       3

            421 online    1,322     46.8      15

           2405 online      258     50.4       8

           

           

          示例2:又例如通過v$sesstatv$statname連接查詢某個SID各項信息。

          select a.*,b.name

            from v$sesstat a,v$statname b

            where a.sid=10 and a.statistic#=b.statistic#;

          posted @ 2009-11-17 11:40 gdufo| 編輯 收藏

          學習動態性能表 第一篇--v$sysstat 2007.5.23

          轉自網絡

           

           按照OracleDocument中的描述,v$sysstat存儲自數據庫實例運行那刻起就開始累計全實例(instance-wide)的資源使用情況。

          類似于v$sesstat,該視圖存儲下列的統計信息:

          1>.事件發生次數的統計(如:user commits)

          2>.數據產生,存取或者操作的total(如:redo size)

          3>.如果TIMED_STATISTICS值為true,則統計花費在執行操作上的總時間(如:CPU used by this session)

          v$sysstat視圖常用列介紹:

          l         STATISTIC#: 標識

          l         NAME: 統計項名稱

          l         VALUE: 資源使用量

          該視圖還有一列class-統計類別但極少會被使用,各類信息如下:

          1 代表事例活動

          2 代表Redo buffer活動

          4 代表鎖

          8 代表數據緩沖活動

          16 代表OS活動

          32 代表并行活動

          64 代表表訪問

          128 代表調試信息

          注意:Statistic#的值在不同版本中各不相同,使用時要用Name做為查詢條件而不要以statistic#的值做為條件。

          使用v$sysstat中的數據

            該視圖中數據常被用于監控系統性能。如buffer cache命中率、軟解析率等都可從該視圖數據計算得出。

            該視圖中的數據也被用于監控系統資源使用情況,以及系統資源利用率的變化。正因如此多的性能數據,檢查某區間內系統資源使用情況可以這樣做,在一個時間段開始時創建一個視圖數據快照,結束時再創建一個,二者之間各統計項值的不同(end value - begin value)即是這一時間段內的資源消耗情況。這是oracle工具的常用方法,諸如Statspack以及BSTAT/ESTAT都是如此。

            為了對比某個區間段的數據,源數據可以被格式化(每次事務,每次執行,每秒鐘或每次登陸),格式化后數據更容易從兩者中鑒別出差異。這類的對比在升級前,升級后或僅僅想看看一段時間內用戶數量增長或數據增加如何影響資源使用方面更加實用。

            你也可以使用v$sysstat數據通過查詢v$system_event視圖來檢查資源消耗和資源回收。

          V$SYSSTAT中的常用統計

            V$SYSSTAT中包含多個統計項,這部分介紹了一些關鍵的v$sysstat統計項,在調優方面相當有用。下列按字母先后排序:

          數據庫使用狀態的一些關鍵指標:

          l         CPU used by this session:所有sessioncpu占用量,不包括后臺進程。這項統計的單位是百分之x.完全調用一次不超過10ms

          l         db block changes:那部分造成SGA中數據塊變化的insert,updatedelete操作數 這項統計可以大概看出整體數據庫狀態。在各項事務級別,這項統計指出臟緩存比率。

          l         execute count:執行的sql語句數量(包括遞歸sql)

          l         logons current:當前連接到實例的Sessions。如果當前有兩個快照則取平均值。

          l         logons cumulative:自實例啟動后的總登陸次數。

          l         parse count (hard):在shared pool中解析調用的未命中次數。當sql語句執行并且該語句不在shared pool或雖然在shared pool但因為兩者存在部分差異而不能被使用時產生硬解析。如果一條sql語句原文與當前存在的相同,但查詢表不同則認為它們是兩條不同語句,則硬解析即會發生。硬解析會帶來cpu和資源使用的高昂開銷,因為它需要oracleshared pool中重新分配內存,然后再確定執行計劃,最終語句才會被執行。

          l         parse count (total):解析調用總數,包括軟解析和硬解析。當session執行了一條sql語句,該語句已經存在于shared pool并且可以被使用則產生軟解析。當語句被使用(即共享) 所有數據相關的現有sql語句(如最優化的執行計劃)必須同樣適用于當前的聲明。這兩項統計可被用于計算軟解析命中率。

          l         parse time cpu:總cpu解析時間(單位:10ms)。包括硬解析和軟解析。

          l         parse time elapsed:完成解析調用的總時間花費。

          l         physical readsOS blocks read數。包括插入到SGA緩存區的物理讀以及PGA中的直讀這項統計并非i/o請求數。

          l         physical writes:從SGA緩存區被DBWR寫到磁盤的數據塊以及PGA進程直寫的數據塊數量。

          l         redo log space requests:在redo logs中服務進程的等待空間,表示需要更長時間的log switch

          l         redo sizeredo發生的總次數(以及因此寫入log buffer),以byte為單位。這項統計顯示出update活躍性。

          l         session logical reads:邏輯讀請求數。

          l         sorts (memory) and sorts (disk)sorts(memory)是適于在SORT_AREA_SIZE(因此不需要在磁盤進行排序)的排序操作的數量。sorts(disk)則是由于排序所需空間太大,SORT_AREA_SIZE不能滿足而不得不在磁盤進行排序操作的數量。這兩項統計通常用于計算in-memory sort ratio

          l         sorts (rows): 列排序總數。這項統計可被'sorts (total)'統計項除盡以確定每次排序的列。該項可指出數據卷和應用特征。

          l         table fetch by rowid:使用ROWID返回的總列數(由于索引訪問或sql語句中使用了'where rowid=&rowid'而產生)

          l         table scans (rows gotten):全表掃描中讀取的總列數

          l         table scans (blocks gotten):全表掃描中讀取的總塊數,不包括那些split的列。

          l         user commits + user rollbacks:系統事務起用次數。當需要計算其它統計中每項事務比率時該項可以被做為除數。例如,計算事務中邏輯讀,可以使用下列公式:session logical reads / (user commits + user rollbacks)

          注:SQL語句的解析有軟解析soft parse與硬解析hard parse之說,以下是5個步驟:

          1:語法是否合法(sql寫法)

          2:語義是否合法(權限,對象是否存在)

          3:檢查該sql是否在公享池中存在

          -- 如果存在,直接跳過45,運行sql. 此時算soft parse

          4:選擇執行計劃

          5:產生執行計劃

          -- 如果5個步驟全做,這就叫hard parse.

          注意物理I/O

            oracle報告物理讀也許并未導致實際物理磁盤I/O操作。這完全有可能因為多數操作系統都有緩存文件,可能是那些塊在被讀取。塊也可能存于磁盤或控制級緩存以再次避免實際I/OOracle報告有物理讀也許僅僅表示被請求的塊并不在緩存中。

          V$SYSSTAT得出實例效率比(Instance Efficiency Ratios)

          下列是些典型的instance efficiency ratios v$sysstat數據計算得來,每項比率值應該盡可能接近1

          l         Buffer cache hit ratio:該項顯示buffer cache大小是否合適。

          公式:1-((physical reads-physical reads direct-physical reads direct (lob)) / session logical reads)

          執行:

          select1-((a.value-b.value-c.value)/d.value)

           from v$sysstat a,v$sysstat b,v$sysstat c,v$sysstat d

           where a.name='physical reads'and

                   b.name='physical reads direct'and

                   c.name='physical reads direct (lob)'and

                   d.name='session logical reads';

          l         Soft parse ratio:這項將顯示系統是否有太多硬解析。該值將會與原始統計數據對比以確保精確。例如,軟解析率僅為0.2則表示硬解析率太高。不過,如果總解析量(parse count total)偏低,這項值可以被忽略。

          公式:1 - ( parse count (hard) / parse count (total) )

          執行:

          select1-(a.value/b.value)

           from v$sysstat a,v$sysstat b

           Wherea.name='parse count (hard)'and b.name='parse count (total)';

          l         In-memory sort ratio:該項顯示內存中完成的排序所占比例。最理想狀態下,在OLTP系統中,大部分排序不僅小并且能夠完全在內存里完成排序。

          公式:sorts (memory) / ( sorts (memory) + sorts (disk) )

          執行:

          select a.value/(b.value+c.value)

           from v$sysstat a,v$sysstat b,v$sysstat c

           wherea.name='sorts (memory)'and

                   b.name='sorts (memory)'andc.name='sorts (disk)';

          l         Parse to execute ratio:在生產環境,最理想狀態是一條sql語句一次解析多數運行。

          公式:1 - (parse count/execute count)

          執行:

          select1-(a.value/b.value)

           from v$sysstat a,v$sysstat b

           where a.name='parse count (total)'and b.name='execute count';

          l         Parse CPU to total CPU ratio:該項顯示總的CPU花費在執行及解析上的比率。如果這項比率較低,說明系統執行了太多的解析。

          公式:1 - (parse time cpu / CPU used by this session)

          執行:

          select1-(a.value/b.value)

           from v$sysstat a,v$sysstat b

           where a.name='parse time cpu'and

                   b.name='CPU used by this session';

          l         Parse time CPU to parse time elapsed:通常,該項顯示鎖競爭比率。這項比率計算

          是否時間花費在解析分配給CPU進行周期運算(即生產工作)。解析時間花費不在CPU周期運算通常表示由于鎖競爭導致了時間花費

          公式:parse time cpu / parse time elapsed

          執行:

          select a.value/b.value

           from v$sysstat a,v$sysstat b

           where a.name='parse time cpu'and b.name='parse time elapsed';

          V$SYSSTAT獲取負載間檔(Load Profile)數據

            負載間檔是監控系統吞吐量和負載變化的重要部分,該部分提供如下每秒和每個事務的統計信息:logons cumulative, parse count (total), parse count (hard), executes, physical reads, physical writes, block changes, and redo size.

            被格式化的數據可檢查'rates'是否過高,或用于對比其它基線數據設置為識別system profile在期間如何變化。例如,計算每個事務中block changes可用如下公式:

          db block changes / ( user commits + user rollbacks )

          執行:

          select a.value/(b.value+c.value)

           from v$sysstat a,v$sysstat b,v$sysstat c

           where a.name='db block changes'and

                   b.name='user commits'andc.name='user rollbacks';

          其它計算統計以衡量負載方式,如下:

          l         Blocks changed for each read:這項顯示出block changesblock reads中的比例。它將指出是否系統主要用于只讀訪問或是主要進行諸多數據操作(如:inserts/updates/deletes)

          公式:db block changes / session logical reads

          執行:

          select a.value/b.value

           from v$sysstat a,v$sysstat b

           where a.name='db block changes'and

                   b.name='session logical reads' ;

          l         Rows for each sort

          公式:sorts (rows) / ( sorts (memory) + sorts (disk) )

          執行:

          select a.value/(b.value+c.value)

           from v$sysstat a,v$sysstat b,v$sysstat c

           where a.name='sorts (rows)'and

                   b.name='sorts (memory)'andc.name='sorts (disk)';

          posted @ 2009-11-17 11:38 gdufo 閱讀(127) | 評論 (0)編輯 收藏

          SQL_TRACE及 Tkprof用法以及問題分析

          ORACLE中SQL TRACE和TKPROF的使用
          SQL TRACE 和 tkprof sql語句分析工具

          一 SQL TRACE 使用方法:
          1.初始化sql trace
          參數:
          timed_statistics=true 允許sql trace 和其他的一些動態性能視圖收集與時間有關的參數、
          SQL>alter session set titimed_statistics=true
          max_dump_file_size=500 指定跟蹤文件的大小
          SQL> alter system set max_dump_file_size=500;
          user_dump_dest 指定跟蹤文件的路徑
          SQL> alter system set user_dump_dest=/oracle/oracle/diag/rdbms/orcl/orcl/trace;

          2.為一個session 啟動sql trace

          2.1命令方式
          alter session set sql_trace=true
          2.2 通過存儲過程啟動sqltrace
          select sid,serial#,osuser from v$session;
          SID SERIAL# OSUSER
          168 1 oracle

          execute rdbms_system.set_sql_trace_in_session (168 ,1,true);
          3.停止一個sql trace 會話
          3.1 命令方式
          alter session set sql_trace=false
          3.2 儲存過程的方式
          execute rdbms_system.set_sql_trace_in_session (168 ,1,false);
          4. 為整個實例啟動SQL trace (一般消耗系統性能較高,不會用)
          alter system set sql_trace=true scope=spfile
          從新啟動數據庫
          5. 停止一個實例的sql trace
          alter system set sql_trace=flase scope=spfile

          啟動sql trace 之后收集的信息包括
          1.解析、執行、返回數據的次數
          2.cpu和執行命令的時間
          3.物理讀和邏輯讀的次數
          4.系統處理的記錄數
          5.庫緩沖區錯誤
          二 TKPROF的使用
          tkprof 的目的是將sql trace 生成的跟蹤文件轉換成用戶可以理解的格式
          1. 格式
          tkprof inputfile outputfile [optional | parameters ]
          參數和選項:
          explain=user/password 執行explain命令將結果放在SQL trace的輸出文件中
          table=schema.table 指定tkprof處理sql trace文件時臨時表的模式名和表名
          insert=scriptfile 創建一個文件名為scriptfile的文件,包含了tkprof存放的輸出sql語句
          sys=[yes/no] 確定系統是否列出由sys用戶產生或重調的sql語句
          print=number 將僅生成排序后的第一條sql語句的輸出結果
          record=recordfile 這個選項創建一個名為recorderfile的文件,包含了所有重調用的sql語句
          sort=sort_option 按照指定的方法對sql trace的輸出文件進行降序排序
          sort_option 選項
          prscnt 按解析次數排序
          prscpu 按解析所花cpu時間排序
          prsela 按解析所經歷的時間排序
          prsdsk 按解析時物理的讀操作的次數排序
          prsqry 按解析時以一致模式讀取數據塊的次數排序
          prscu 按解析時以當前讀取數據塊的次數進行排序
          execnt 按執行次數排序
          execpu 按執行時花的cpu時間排序
          exeela 按執行所經歷的時間排序
          exedsk 按執行時物理讀操作的次數排序
          exeqry 按執行時以一致模式讀取數據塊的次數排序
          execu 按執行時以當前模式讀取數據塊的次數排序
          exerow 按執行時處理的記錄的次數進行排序
          exemis 按執行時庫緩沖區的錯誤排序
          fchcnt 按返回數據的次數進行排序
          fchcpu 按返回數據cpu所花時間排序
          fchela 按返回數據所經歷的時間排序
          fchdsk 按返回數據時的物理讀操作的次數排序
          fchqry 按返回數據時一致模式讀取數據塊的次數排序
          fchcu 按返回數據時當前模式讀取數據塊的次數排序
          fchrow 按返回數據時處理的數據數量排序
          三 sql trace 的輸出結果
          count:提供OCI過程的執行次數
          CPU: 提供執行CPU所花的時間單位是秒
          Elapsed:提供了執行時所花的時間。單位是秒。這個參數值等于用戶響應時間
          Disk:提供緩存區從磁盤讀取的次數
          Query:以一致性模式從緩存區獲得數據的次數
          Current:以當前模式從緩存區獲得數據的次數
          ROWs: 返回調用或執行調用時,處理的數據行的數量。

          在report.txt文件頭有各個數據的解釋,根據以下一些指標可以分析一下SQL的執行性能: query+current/rows 平均每行所需的block數,太大的話(超過20)SQL語句效率太低
          Parse count/Execute count parse count應盡量接近1,如果太高的話,SQL會進行不必要的reparse。要檢查Pro*C程序的MAXOPENCURSORS是不是太低了,或不適當的使用的RELEASE_CURSOR選項
          rows Fetch/Fetch Fetch Array的大小,太小的話就沒有充分利用批量Fetch的功能,增加了數據在客戶端和服務器之間的往返次數。在Pro*C中可以用prefetch=NN,Java/JDBC中可調用SETROWPREFETCH,在PL/SQL中可以用BULK COLLECT,SQLPLUS中的arraysize(缺省是15)
          disk/query+current 磁盤IO所占邏輯IO的比例,太大的話有可能是db_buffer_size過小(也跟SQL的具體特性有關)
          elapsed/cpu 太大表示執行過程中花費了大量的時間等待某種資源
          cpu OR elapsed 太大表示執行時間過長,或消耗了大量的CPU時間,應該考慮優化
          執行計劃中的Rows 表示在該處理階段所訪問的行數,要盡量減少


          四:舉例:
          sql>alter session set sql_trace=true
          SQL>select * from dba_users;
          SQL>show parameter user_dump_dest
          user_dump_dest string /oracle/oracle/diag/rdbms/orcl/orcl/trace
          SQL>exit
          cd /oracle/oracle/diag/rdbms/orcl/orcl/trace
          tkprof orcl_ora_11066.trc /oracle/oracle/trace1.out sys=yes

          vi trace.out

          1. query+current/rows 平均每行所需的block數,太大的話(超過20)SQL語句效率太低
          2. Parse count/Execute count parse count應盡量接近1,如果太高的話,SQL會進行不必要的reparse。
          要檢查Pro*C程序的MAXOPENCURSORS是不是太低了,或不適當的使用的RELEASE_CURSOR選項
          3. rows Fetch/Fetch Fetch Array的大小,太小的話就沒有充分利用批量Fetch的功能,
          增加了數據在客戶端和服務器之間的往返次數。在Pro*C中可以用prefetch=NN,Java/JDBC中可調用SETROWPREFETCH,
          在PL/SQL中可以用BULK COLLECT,SQLPLUS中的arraysize(缺省是15)  
          4. disk/query+current 磁盤IO所占邏輯IO的比例,太大的話有可能是db_buffer_size過小(也跟SQL的具體特性有關)  
          5. elapsed/cpu 太大表示執行過程中花費了大量的時間等待某種資源  
          6. cpu OR elapsed 太大表示執行時間過長,或消耗了大量的CPU時間,應該考慮優化
          7. 執行計劃中的Rows 表示在該處理階段所訪問的行數,要盡量

          posted @ 2009-11-16 19:39 gdufo 閱讀(1140) | 評論 (0)編輯 收藏

          oracle大表分區的一點點心得

          http://www.knowsky.com/388420.html

          最近在做一個客戶關系治理系統,項目做的到不是非常成功,可還是學到了不少的知識,由于數據量很大,沒有專門的Oracle數據庫人員支持,對數據庫優化治理等也只有我這個約懂一點的人上了。在對數據庫優化上有一點點心得寫出來希望能同大家一起學習和交流。

          數據庫大表的優化:采用蔟表(clustered tables)及蔟索引(Clustered Index)
          蔟表和蔟索引是oracle所提供的一種技術,其基本思想是將幾張具有相同數據項、 并且經常性一起使用的表通過共享數據塊(data block)的模式存放在一起。各表間的共同字段作為蔟鍵值(cluster key),數據庫在訪問數據時,首先找到蔟鍵值,以此同時獲得若干張表的相關數據。蔟表所能帶來的好處是可以減少I/O和減少存儲空間,其中我更看重前 者。采用表分區(partition)
          表分區技術是在超大型數據庫(VLDB)中將大表及其索引通過分區(patition)的形式分割為若干較小、可治理的小塊,并且每一分區可 進一步劃分為更小的子分區(sub partition)。而這種分區對于應用來說是透明的。通過對表進行分區,可以獲得以下的好處:
          1)減少數據損壞的可能性。
          2)各分區可以獨立備份和恢復,增強了數據庫的可治理性。
          3)可以控制分區在硬盤上的分布,以均衡IO,改善了數據庫的性能。
          蔟表與表分區技術的側重點各有不同,前者側重于改進關聯表間查詢的效率,而表分區側重于大表的可治理性及局部查詢的性能。而這兩項對于我的系統來說都是極為重要。由于本人技術限制,目前尚不確定兩者是否可以同時實現,有那位在這方面有經驗的給點指導將不勝感激。 
          在兩者無法同時實現的情況下,應依照需實現的功能有所取舍。綜合兩種模式的優缺點,我認為采用表分區技術較為適用于我們的應用。
          Oracle的表分區有以下幾種類型:
          1)范圍分區:將表按某一字段或若干個字段的取值范圍分區。
          2)hash分區:將表按某一字段的值均勻地分布到若干個指定的分區。
          3)復合分區:結合了前面兩種分區類型的優點,首先通過值范圍將表進行分區,然后以hash模式將數據進一步均勻分配至物理存儲位置。
          綜合考慮各項因素,以第三種類型最為優越。(本人實在技術有限僅采用了第1種范圍分區,因為比較簡單,便于治理)
          優化的具體步驟:
          1.確定需要優化分區的表:
          經過對系統數據庫表結構和字段,應用程序的分析,現在確定那些大表需要進行分區:
          如帳戶交易明細表acct_detail.
          2.確定表分區的方法和分區鍵:
          分區類型:采用范圍分區。
          分 區 鍵:
          按trans_date(交易時間)字段進行范圍分區.
          3.確定分區鍵的分區范圍,及打算分多少分區:
          如:帳戶交易明細表acct_detail.
          根據字段(trans_date)分成一下分區:
          1).分區1:09/01/2003   
          2).分區2:10/01/2003   
          3).分區3:11/01/2003   
          4).分區4:12/01/2003   
          5).分區5:01/01/2004 
          6).分區6:02/01/2004 
             該表明顯需要在以后增加分區。
          4.建立分區表空間和分區索引空間
            1).建立表的各個分區的表空間: 
             1.分區1:crm_detail_200309
             CREATE TABLESPACE crm_detail_200309  DATAFILE  
             ‘/u1/oradata/orcl/crm_detail_20030901.dbf’ 
             SIZE 2000M EXTENT MANAGEMENT LOCAL UNIFORM size 16M;
             其它月份以后同以上(我在此采用oracle的表空間本地治理的方法)。

            2). 建立分區索引表空間
             1.分區1:index_detail_200309
             CREATE TABLESPACE index_detail_200309  DATAFILE  
             ‘/u3/oradata/orcl/index_detail_20030901.dbf’ 
             SIZE 2000M  EXTENT MANAGEMENT LOCAL UNIFORM size 16M;
          5.建立基于分區的表:
             create  table  table name
             (

              ........
              )
              enable row movment               --此語句是能修改行分區鍵值,也就是如不添加該                                     句不能修改記錄的分區鍵值,不能使記錄分區遷移
              PARTITION   BY   RANGE  (TRANS_DATE)
              (
                 PARTITION     crm_detail_200309  VALUES  LESS THAN 
          (TO_DATE (‘09/01/2003’,’mm/dd/yyyy’ ) )
          TABLESPACE   crm_detail_200309,
                 其他分區.....
               );
          6.建立基于分區的索引:
            create  index   index_name  on table_name (分區鍵+…)
             global                                  --這里是全局分區索引,也可以建本地索引
             PARTITION   BY   RANGE  (TRANS_DATE)
             (
               PARTITION     index_detail_200309  VALUES  LESS THAN 
               (TO_DATE ('09/01/2003','mm/dd/yyyy' )) 
               TABLESPACE   index_detail_200309,
               其他索引分區...
              );
             
          對表的分區就這樣完成了,第一次主要確定表分區的分區策約是最重要的,可我覺得對表分區難在以后對表分區的治理上面,因為隨著數據量的增加,表分 區必然存在刪除,擴容,增加等。在這些過程中還牽涉到全局等索引,因為對分區表進行ddl操作為破壞全局索引,故全局索引必須在ddl后要重 rebuild.

          以上寫的很亂也很差,希望大家多多諒解和指點。

          posted @ 2009-11-15 10:25 gdufo 閱讀(1673) | 評論 (1)編輯 收藏

          oracle分區表總結(轉)

          http://m77m78.itpub.net/post/125/280787


          ORACLE里如果遇到特別大的表,可以使用分區的表來改變其應用程序的性能。


          同事的分區表總結,轉載一下。

          1.1分區表PARTITION table

          ORACLE里如果遇到特別大的表,可以使用分區的表來改變其應用程序的性能。

          1.1.1分區表的建立:

          某公司的每年產生巨大的銷售記錄,DBA向公司建議每季度的數據放在一個分區內,以下示范的是該公司1999年的數據(假設每月產生30M的數據),操作如下:

          范圍分區表:

          CREATE TABLE sales

          (invoice_no NUMBER,

          ...

          sale_date DATE NOT NULL )

          PARTITION BY RANGE (sale_date)

          (PARTITION sales1999_q1

          VALUES LESS THAN (TO_DATE(‘1999-04-01’,’YYYY-MM-DD’)

          TABLESPACE ts_sale1999q1,

          PARTITION sales1999_q2

          VALUES LESS THAN (TO_DATE(‘1999-07-01’,’YYYY-MM-DD’)

          TABLESPACE ts_sale1999q2,

          PARTITION sales1999_q3

          VALUES LESS THAN (TO_DATE(‘1999-10-01’,’YYYY-MM-DD’)

          TABLESPACE ts_sale1999q3,

          PARTITION sales1999_q4

          VALUES LESS THAN (TO_DATE(‘2000-01-01’,’YYYY-MM-DD’)

          TABLESPACE ts_sale1999q4 );

          --values less than (maxvalue)

          列表分區表:

          create table emp (

          empno number(4),

          ename varchar2(30),

          location varchar2(30))

          partition by list (location)

          (partition p1 values ('北京'),

          partition p2 values ('上海','天津','重慶'),

          partition p3 values ('廣東','福建')

          partition p0 values (default)

          );

          哈希分區:

          create table emp (

          empno number(4),

          ename varchar2(30),

          sal number)

          partition by hash (empno)

          partitions 8

          store in (emp1,emp2,emp3,emp4,emp5,emp6,emp7,emp8);

          組合分區:

          范圍哈希組合分區:

          create table emp (

          empno number(4),

          ename varchar2(30),

          hiredate date)

          partition by range (hiredate)

          subpartition by hash (empno)

          subpartitions 2

          (partition e1 values less than (to_date('20020501','YYYYMMDD')),

          partition e2 values less than (to_date('20021001','YYYYMMDD')),

          partition e3 values less than (maxvalue));

          范圍列表組合分區:

          CREATE TABLE customers_part (

          customer_id NUMBER(6),

          cust_first_name VARCHAR2(20),

          cust_last_name VARCHAR2(20),

          nls_territory VARCHAR2(30),

          credit_limit NUMBER(9,2))

          PARTITION BY RANGE (credit_limit)

          SUBPARTITION BY LIST (nls_territory)

          SUBPARTITION TEMPLATE

          (SUBPARTITION east VALUES ('CHINA', 'JAPAN', 'INDIA', 'THAILAND'),

          SUBPARTITION west VALUES ('AMERICA', 'GERMANY', 'ITALY', 'SWITZERLAND'),

          SUBPARTITION other VALUES (DEFAULT))

          (PARTITION p1 VALUES LESS THAN (1000),

          PARTITION p2 VALUES LESS THAN (2500),

          PARTITION p3 VALUES LESS THAN (MAXVALUE));

          create table t1 (id1 number,id2 number)

          partition by range (id1) subpartition by list (id2)

          (partition p11 values less than (11)

          (subpartition subp1 values (1))

          );

          索引分區:

          CREATE INDEX month_ix ON sales(sales_month)
          GLOBAL PARTITION BY RANGE(sales_month)
          (PARTITION pm1_ix VALUES LESS THAN (2)
          PARTITION pm12_ix VALUES LESS THAN (MAXVALUE));

          1.1.2分區表的維護:

          增加分區:

          ALTER TABLE sales ADD PARTITION sales2000_q1

          VALUES LESS THAN (TO_DATE(‘2000-04-01’,’YYYY-MM-DD’)

          TABLESPACE ts_sale2000q1;

          如果已有maxvalue分區,不能增加分區,可以采取分裂分區的辦法增加分區!

          刪除分區:

          ALTER TABLE salesDROP PARTION sales1999_q1;

          截短分區:

          alter table sales truncate partiton sales1999_q2;

          合并分區:

          alter table sales merge partitons sales1999_q2, sales1999_q3 into sales1999_q23;

          alter index ind_t2 rebuild partition p123 parallel 2;

          分裂分區:

          ALTER TABLE sales

          SPLIT PARTITON sales1999_q4

          AT TO_DATE (‘1999-11-01’,’YYYY-MM-DD’)

          INTO (partition sales1999_q4_p1, partition sales1999_q4_p2) ;

          alter table t2 split partition p123 values (1,2) into (partition p12,partition p3);

          交換分區:

          alter table x exchange partition p0 with table bsvcbusrundatald ;

          訪問指定分區:

          select * from sales partition(sales1999_q2)

          EXPORT指定分區:

          exp sales/sales_password tables=sales:sales1999_q1

          file=sales1999_q1.dmp

          IMPORT指定分區:

          imp sales/sales_password FILE =sales1999_q1.dmp

          TABLES = (sales:sales1999_q1) IGNORE=y

          查看分區信息:

          user_tab_partitions, user_segments

          注:若分區表跨不同表空間,做導出、導入時目標數據庫必須預建這些表空間。分表區各區所在表空間在做導入時目標數據庫一定要預建這些表空間!這些表空間不一定是用戶的默認表空間,只要存在即可。如果有一個不存在,就會報錯!

          默 認時,對分區表的許多表維護操作會使全局索引不可用,標記成UNUSABLE。 那么就必須重建整個全局索引或其全部分區。如果已被分區,Oracle 允許在用于維護操作的ALTER TABLE 語句中指定UPDATE GLOBAL INDEXES 來重載這個默認特性,指定這個子句也就告訴Oracle 當它執行維護操作的DDL 語句時更新全局索引,這提供了如下好處:
          1.在操作基礎表的同時更新全局索引這就不需要后來單獨地重建全局索引;
          2.因為沒有被標記成UNUSABLE, 所以全局索引的可用性更高了,甚至正在執行分區的DDL 語句時仍然可用索引來訪問表中的其他分區,避免了查詢所有失效的全局索引的名字以便重建它們;
          另外在指定UPDATE GLOBAL INDEXES 之前還要考慮如下性能因素:
          1.因為要更新事先被標記成UNUSABLE 的索引,所以分區的DDL 語句要執行更長時間,當然這要與先不更新索引而執行DDL 然后再重建索引所花的時間做個比較,一個適用的規則是如果分區的大小小于表的大小的5% ,則更新索引更快一點;
          2.DROP TRUNCATE 和EXCHANGE 操作也不那么快了,同樣這必須與先執行DDL 然后再重建所有全局索引所花的時間做個比較;
          3.要登記對索引的更新并產生重做記錄和撤消記錄,重建整個索引時可選擇NOLOGGING;
          4.重建整個索引產生一個更有效的索引,因為這更利于使用空間,再者重建索引時允許修改存儲選項。
          注意分區索引結構表不支持UPDATE GLOBAL INDEXES 子句。

          1.1.3普通表變為分區表

          將已存在數據的普通表轉變為分區表,沒有辦法通過修改屬性的方式直接轉化為分區表,必須通過重建的方式進行轉變,一般可以有三種方法,視不同場景使用:

          用例:

          方法一:利用原表重建分區表。

          CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);
          INSERT INTO T
          SELECT ROWNUM, SYSDATE - ROWNUM FROM DBA_OBJECTS WHERE ROWNUM <=
          5000
          ;
          COMMIT;

          CREATE TABLE T_NEW (ID, TIME) PARTITION BY RANGE (TIME)
          (PARTITION P1 VALUES LESS THAN (TO_DATE('2000-1-1', 'YYYY-MM-DD')),
          PARTITION P2 VALUES LESS THAN (TO_DATE('2002-1-1', 'YYYY-MM-DD')),
          PARTITION P3 VALUES LESS THAN (TO_DATE('2005-1-1', 'YYYY-MM-DD')),
          PARTITION P4 VALUES LESS THAN (MAXVALUE))
          AS SELECT ID, TIME FROM T;

          RENAME T TO T_OLD;

          RENAME T_NEW TO T;

          SELECT COUNT(*) FROM T;

          COUNT(*)
          ----------
          5000

          SELECT COUNT(*) FROM T PARTITION (P1);

          COUNT(*)
          ----------
          2946

          SELECT COUNT(*) FROM T PARTITION (P2);

          COUNT(*)
          ----------
          731

          SELECT COUNT(*) FROM T PARTITION (P3);

          COUNT(*)
          ----------
          1096

          優點:方法簡單易用,由于采用DDL語句,不會產生UNDO,且只產生少量REDO,效率相對較高,而且建表完成后數據已經在分布到各個分區中了。

          不足:對于數據的一致性方面還需要額外的考慮。由于幾乎沒有辦法通過手工鎖定T表的方式保證一致性,在執行CREATE TABLE語句和RENAME T_NEW TO T語句直接的修改可能會丟失,如果要保證一致性,需要在執行完語句后對數據進行檢查,而這個代價是比較大的。另外在執行兩個RENAME語句之間執行的對T的訪問會失敗。

          適用于修改不頻繁的表,在閑時進行操作,表的數據量不宜太大。

          方法二:使用交換分區的方法。

          Drop table t;
          CREATE
          TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);
          INSERT INTO T
          SELECT ROWNUM, SYSDATE - ROWNUM FROM DBA_OBJECTS WHERE ROWNUM <=
          5000
          ;
          COMMIT;

          CREATE TABLE T_NEW (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME)
          (PARTITION P1 VALUES LESS THAN (TO_DATE('2005-9-1', 'YYYY-MM-DD')),
          PARTITION P2 VALUES LESS THAN (MAXVALUE));

          ALTER TABLE T_NEW EXCHANGE PARTITION P1 WITH TABLE T;

          RENAME T TO T_OLD;

          RENAME T_NEW TO T;

          優點:只是對數據字典中分區和表的定義進行了修改,沒有數據的修改或復制,效率最高。如果對數據在分區中的分布沒有進一步要求的話,實現比較簡單。在執行完RENAME操作后,可以檢查T_OLD中是否存在數據,如果存在的話,直接將這些數據插入到T中,可以保證對T插入的操作不會丟失。

          不足:仍然存在一致性問題,交換分區之后RENAME T_NEW TO T之前,查詢、更新和刪除會出現錯誤或訪問不到數據。如果要求數據分布到多個分區中,則需要進行分區的SPLIT操作,會增加操作的復雜度,效率也會降低。

          適用于包含大數據量的表轉到分區表中的一個分區的操作。應盡量在閑時進行操作。

          方法三:Oracle9i以上版本,利用在線重定義功能

          Drop table t;
          CREATE
          TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);
          INSERT INTO T
          SELECT ROWNUM, SYSDATE - ROWNUM FROM DBA_OBJECTS WHERE ROWNUM <=
          5000
          ;
          COMMIT;

          EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE(USER, 'T');

          PL/SQL 過程已成功完成。

          CREATE TABLE T_NEW (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME)
          (PARTITION P1 VALUES LESS THAN (TO_DATE('2004-7-1', 'YYYY-MM-DD')),
          PARTITION P2 VALUES LESS THAN (TO_DATE('2005-1-1', 'YYYY-MM-DD')),
          PARTITION P3 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')),
          PARTITION P4 VALUES LESS THAN (MAXVALUE));

          表已創建。

          EXEC DBMS_REDEFINITION.START_REDEF_TABLE(USER, 'T', 'T_NEW');

          PL/SQL 過程已成功完成。

          EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE(USER, 'T', 'T_NEW');

          PL/SQL 過程已成功完成。

          SELECT COUNT(*) FROM T;

          COUNT(*)
          ----------
          5000

          SELECT COUNT(*) FROM T PARTITION (P3);

          COUNT(*)
          ----------
          1096

          優點:保證數據的一致性,在大部分時間內,表T都可以正常進行DML操作。只在切換的瞬間鎖表,具有很高的可用性。這種方法具有很強的靈活性,對各種不同的需要都能滿足。而且,可以在切換前進行相應的授權并建立各種約束,可以做到切換完成后不再需要任何額外的管理操作。

          不足:實現上比上面兩種略顯復雜。

          適用于各種情況。

          這里只給出了在線重定義表的一個最簡單的例子,詳細的描述和例子可以參考下面兩篇文章。

          Oracle的在線重定義表功能:http://blog.itpub.net/post/468/12855

          Oracle的在線重定義表功能(二):http://blog.itpub.net/post/468/12962

          XSB:

          把一個已存在數據的大表改成分區表:

          第一種(表不是太大):

          1.把原表改名:
          rename xsb1 to xsb2;
          2.
          創建分區表:
          CREATE TABLE xsb1
          PARTITION BY LIST (c_test)
          (PARTITION xsb1_p1 VALUES (1),
          PARTITION xsb1_p2 VALUES (2),
          PARTITION xsb1_p0 VALUES (default))
          nologging AS SELECT * FROM xsb2;
          3.
          將原表上的觸發器、主鍵、索引等應用到分區表上;
          4.
          刪除原表:
          drop table xsb2;

          第二種(表很大)

          1.創建分區表:
          CREATE TABLE x PARTITION BY LIST (c_test) [range ()]
          (PARTITION p0 VALUES [less than ](1) tablespace tbs1,
          PARTITION p2 VALUES (2) tablespace tbs1,
          PARTITION xsb1_p0 VALUES ([maxvalue]default))
          AS SELECT * FROM xsb2 [where 1=2];

          2.交換分區 alter table x exchange partition p0 with table bsvcbusrundatald ;

          3.原表改名alter table bsvcbusrundatald rename to x0;

          4.新表改名alter table x rename to bsvcbusrundatald ;

          5.刪除原表drop table x0;

          6.創建新表觸發器和索引create index ind_busrundata_lp on bsvcbusrundatald(。。。) local tablespace tbs_brd_ind ;

          或者:

          1.規劃原大表中數據分區的界限,原則上將原表中近期少量數據復制至另一表;

          2.暫停原大表中的相關觸發器;

          3.刪除原大表中近期數據;

          4.改名原大表名稱;

          5.創建分區表;

          6.交換分區;

          7.重建相關索引及觸發器(先刪除之再重建).

          參考腳本:

          select count(*) from t1 where recdate>sysdate-2

          create table x2 nologging as select * from t1 where recdate>trunc(sysdate-2)

          alter triger trg_t1 disable

          delete t1 where recdate>sysdate-2

          commit

          rename t1 to x1

          create table t1 [nologging] partition by range(recdate)

          (partition pbefore values less than (trunc(sysdate-2)),

          partition pmax values less than (maxvalue))

          as select * from x1 where 1=2

          alter table t1 exchange partition pbefore with table x1

          alter table t1 exchange partition pmax with table x2

          drop table x2

          [重建觸發器]

          drop table x1

          1.1.4參考材料:

          如果表中預期的數據量較大通常都需要考慮使用分區表確定使用分區表后還要確定什么類型的分區range partitionhash partitionlist partition、分區區間大小等。分區的創建最好與程序有某種默契,偶曾經創建分區表,按自然月份定義分區的,但程序卻在查詢時默認的開始時間與結束時間是:當前日期-30至當前日期,比如當天是9.18號,那查詢條件被產生為8.18-9.18,結果分區后并不沒有大幅提高性能,后來對程序的查詢日期做了調整,按自然月查詢,系統的負載小了很多。

          Oracle8.0開始支持表分區(MSSQL2005開始支持表分區)。

          Oracle9i 分區能夠提高許多應用程序的可管理性、性能與可用性。分區可以將表、索引及索引編排表進一步劃分,從而可以更精細地對這些數據庫對象進行管理和訪問。Oracle 提供了種類繁多的分區方案以滿足所有的業務需要。另外,由于在 SQL 語句中是完全透明的,所以分區可以用于幾乎所有的應用程序。

          分區表允許將數據分成被稱為分區甚至子分區的更小的更好管理的塊。索引也可以這么分區。每個分區可以被單獨管理,可以不依賴于其他分區而單獨發揮作用,因此提供了一個更有利于可用性和性能的結構。

          分 區可以提高可管理性、性能與可用性,從而給各種各樣的應用程序帶來極大的好處。通常,分區可以使某些查詢以及維護操作的性能大大提高。此外,分區還能夠在 很大程度上簡化日常管理任務。分區還使數據庫設計人員和管理員能夠解決尖端應用程序帶來的最難的問題。分區是建立上億萬字節數據系統或需要極高可用性系統 的關鍵工具。

          在多CPU配置環境下,如果打算使用并行執行,則分區提供了另一種并行的方法。通過給表或索引的不同分區分配不同的并行執行服務器,就可以并行執行對分區表和分區索引的操作。

          表或索引的分區和子分區都共享相同的邏輯屬性。例如表的所有分區或子分區共享相同的列和約束定義,一個索引的分區或子分區共享相同的索引選項。然而它們可以具有不同的物理屬性如表空間。

          盡管不需要將表或索引的每個分區或子分區放在不同的表空間,但這樣做更好。將分區存儲到不同的表空間能夠

          l減少數據在多個分區中沖突的可能性

          l可以單獨備份和恢復每個分區

          l控制分區與磁盤驅動器之間的映射對平衡I/O 負載是重要的

          l改善可管理性可用性和性能

          分區操作對現存的應用和運行在分區表上的標準DML 語句來說是透明的。但是可以通過在DML 中使用分區擴展表或索引的名字來對應用編程,使其利用分區的優點。

          可以使用SQL*LoaderImport Export 工具來裝載或卸載分區表中的數據。這些工具都是支持分區和子分區的。

          分區的方法

          Oracle9i 提供了如下5種分區方法:

          l范圍分區Range

          l散列分區Hash

          l列表分區List

          l組合范圍-散列分區Range-Hash

          l組合范圍-列表分區Range-List

          可對索引和表分區。全局索引只能按范圍分區,但可以將其定義在任何類型的分區或非分區表上。通常全局索引比局部索引需要更多的維護。

          一般組建局部索引,以便反映其基礎表的結構。它與基礎表是等同分區的,即它與基礎

          表在同樣的列上分區,創建同樣數量的分區或子分區,設置與基礎表相對應的同樣的分區邊界。對局部索引而言,當維護活動影響分區時,會自動維護索引分區。這保證了索引與基礎表之間的等同分區。

          關于范圍分區Range

          要想將行映射到基于列值范圍的分區,就使用范圍分區方法。當數據可以被劃分成邏輯范圍時如年度中的月份,這種類型的分區就有用了。當數據在整個范圍中能被均等地劃分時性能最好。如果靠范圍的分區會由于不均等的劃分而導致分區在大小上明顯不同時,就需要考慮其他的分區方法。

          關于散列分區Hash

          如果數據不那么容易進行范圍分區,但為了性能和管理的原因又想分區時,就使用散列分區方法。散列分區提供了一種在指定數量的分區中均等地劃分數據的方法。基于分區鍵的散列值將行映射到分區中。創建和使用散列分區會給你提供了一種很靈活的放置數據的方法,因為你可以通過在I/O 驅動器之間播撒(摘掉)這些均等定量的分區,來影響可用性和性能。

          關于列表分區List

          當 你需要明確地控制如何將行映射到分區時,就使用列表分區方法。可以在每個分區的描述中為該分區列指定一列離散值,這不同于范圍分區,在那里一個范圍與一個 分區相關,這也不同于散列分區,在那里用戶不能控制如何將行映射到分區。列表分區方法是特意為遵從離散值的模塊化數據劃分而設計的。范圍分區或散列分區不 那么容易做到這一點。進一步說列表分區可以非常自然地將無序的和不相關的數據集進行分組和組織到一起。

          與范圍分區和散列分區所不同,列表分區不支持多列分區。如果要將表按列分區,那么分區鍵就只能由表的一個單獨的列組成,然而可以用范圍分區或散列分區方法進行分區的所有的列,都可以用列表分區方法進行分區。

          關于組合范圍-散列分區:

          范圍和散列技術的組合,首先對表進行范圍分區,然后用散列技術對每個范圍分區再次分區。給定的范圍分區的所有子分區加在一起表示數據的邏輯子集。

          關于組合范圍-列表分區:

          范圍和列表技術的組合,首先對表進行范圍分區,然后用列表技術對每個范圍分區再次分區。與組合范圍-散列分區不同的是,每個子分區的所有內容表示數據的邏輯子集,由適當的范圍和列表分區設置來描述。

          創建或更改分區表時可以指定行移動子句,即ENABLE ROW MOVEMENT DISABLE ROW MOVEMENT ,當其鍵被更改時該子句啟用或停用將行遷移到一個新的分區。默認值為DISABLE ROW MOVEMENT。本產品(項目)使用ENABLE ROW MOVEMENT子句。

          分區技術能夠提高數據庫的可管理性:

          使用分區技術,維護操作可集中于表的特定部分。例如,數據庫管理員可以只對表的一部分做備份,而不必對整個表做備份。對整個數據庫對象的維護操作,可以在每個分區的基礎上進行,從而將維護工作分解成更容易管理的小塊。

          分區技術提高可管理性的一個典型用法是支持數據倉庫中的滾動視窗加 載進程。假設數據庫管理員每周向表中加載新數據。該表可以是范圍分區,以便每個分區包含一周的數據。加載進程只是簡單地添加新的分區。添加一個新分區的操 作比修改整個表效率高很多,因為數據庫管理員不需要修改任何其他分區。從分區后的表中去除數據也是一樣。你只要用一個很簡便快捷的數據字典操作刪掉一個分 區,而不必發出使用大量資源和調動所有要刪除的數據的 ‘DELETE’ 命令。

          分區技術能夠提高數據庫的性能:

          由于減少了所檢查或操作的數據數量,同時允許并行執行,Oracle9i 的分區功能提供了性能上的優勢。這些性能包括:

          l分 區修整:分區修整是用分區技術提高性能的最簡單最有價值的手段。分區修整常常能夠將查詢性能提高幾個數量級。例如,假定應用程序中有包含定單歷史記錄的定 單表,該表用周進行了分區。查詢一周的定單只需訪問該定單表的一個分區。如果該定單表包含兩年的歷史記錄,這個查詢只需要訪問一個而不是一百零四個分區。 該查詢的執行速度因為分區修整而有可能快一百倍。分區修整能與所有其他 Oracle 性能特性協作。Oracle 公司將把分區修整技術與索引技術、連結技術和并行訪問方法一起聯合使用。

          l分 區智能聯接:分區功能可以通過稱為分區智能聯接的技術提高多表聯接的性能。當兩個表要聯接在一起,而且每個表都用聯接關鍵字來分區時,就可以使用分區智能 聯接。分區智能聯接將大型聯接分解成較小的發生在各個分區間的聯接,從而用較少的時間完成全部聯接。這就給串行和并行的執行都能帶來顯著的性能改善。

          l更新和刪除的并行執行:分區功能能夠無限地并行執行 UPDATEDELETE MERGE 語句。當訪問分區或未分區的數據庫對象時Oracle 將并行處理 SELECT INSERT 語句。當不使用位圖索引時,也可以對分區或未分區的數據庫對象并行處理 UPDATEDELETE MERGE 語句。為了對有位圖索引的對象并行處理那些操作,目標表必須先分區。這些 SQL 語句的并行執行可以大大提高性能,特別是提高 UPDATE DELETE MERGE 操作涉及大量數據時的性能。

          分區技術提高可用性:

          分 區的數據庫對象具有分區獨立性。該分區獨立性特點可能是高可用性戰略的一個重要部分,例如,如果分區表的分區不能用,但該表的所有其他分區仍然保持在線并 可用。那么這個應用程序可以繼續針對該分區表執行查詢和事務處理,只要不是訪問那個不可用的分區,數據庫操作仍然能夠成功運行。 數據庫管理員可以指定各分區存放在不同的表空間里,從而讓管理員獨立于其它表分區針對每個分區進行備份與恢復操作。 還有,分區功能可以減少計劃停機時間。性能由于分區功能得到了改善,使數據庫管理員在相對較小的批處理窗口完成大型數據庫對象的維護工作。

          posted @ 2009-11-15 10:10 gdufo 閱讀(266) | 評論 (0)編輯 收藏

          僅列出標題
          共19頁: First 上一頁 8 9 10 11 12 13 14 15 16 下一頁 Last 

          導航

          統計

          常用鏈接

          留言簿(6)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          收藏夾

          Hibernate

          友情鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 义乌市| 临清市| 洛阳市| 石首市| 紫阳县| 东源县| 隆尧县| 泰宁县| 高碑店市| 上高县| 玉林市| 手游| 汽车| 乡宁县| 监利县| 胶州市| 盐城市| 资溪县| 昌黎县| 屯留县| 正定县| 镇坪县| 肥城市| 余江县| 三河市| 鹤庆县| 黄石市| 襄汾县| 华宁县| 余江县| 尼勒克县| 永丰县| 武山县| 河南省| 西吉县| 惠安县| 芜湖市| 昌邑市| 广汉市| 库尔勒市| 衡水市|