【原創】Oracle 初始化引數&效能檢視

leonarding發表於2013-03-02

Oracle 初始化引數&效能檢視》

1.資料庫版本

LEO1@LEO1>select * from v$version;

BANNER

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

Oracle Database11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

PL/SQL Release11.2.0.1.0 - Production

CORE    11.2.0.1.0      Production

TNS for Linux:Version 11.2.0.1.0 - Production

NLSRTL Version11.2.0.1.0 - Production

2.設定memory_target引數,並透過v$memory_target_advice分析資料庫的最佳記憶體大小

Memory_target1.oracle11g中的一個記憶體調整引數,11g對自動化管理記憶體方面又繼續加強了,原來10g中可以對SGA進行自動管理與分配,11g即可以自動管理SGA,又可以自動管理PGA,對這兩部分進行綜合管理,自動調整所有記憶體區的大小。11g中預設為0

現在把這幾個引數語法列舉一下,這是靜態引數需要重啟資料庫生效

alter systemset memory_max_target= 1000m scope=spfile;
alter system set  memory_target= 1000m scope=spfile;
alter system set sga_max_size=600m scope=spfile;
alter system set pga_aggregate_target=400m scope=spfile;

2.memory_max_target 是設定 Oracle 能佔實體記憶體多大空間,一個是 Oracle SGA 區最大能佔多大記憶體空間+PGA區多大空間,memory_max_targetmemory_target上限值,如果只設定了memory_max_target沒有設定memory_target,則Oracle認為memory_target=0不使用記憶體自動管理。

3.如果只設定memory_target,沒有設定memory_max_target,則Oracle自動將memory_max_target設定為memory_target

4.如果同時設定這兩個值,則memory_target的上限值為memory_max_target

這是我的資料庫上的引數值

LEO1@LEO1> showparameter memory_max_target

NAME                                 TYPE        VALUE

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

memory_max_target                    big integer 652M

LEO1@LEO1> showparameter memory_target

NAME                                 TYPE        VALUE

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

memory_target                        big integer 652M

5. 10g sga_max_size 是動態分配 Shared Pool Size,database buffer cache,largepool,java poolredo log buffer 大小的,根據 Oracle 執行狀態來重新分配 SGA 各記憶體區大小。 PGA 10g 中需要單獨設定(即手工管理)。

實驗

下面我們透過以下的幾個命令來讓大家清楚memory_target 的設定與PGASGA的關係

1memory_target設定為非0

Memory_Target=SGA_TARGET+PGA_AGGREGATE_TARGET  ,大小等於memory_max_size 一致。

sga_targetpga_aggregate_target都設定了大小,則這兩個引數將做為最小起始值

sga_target  設定大小, pga_aggregate_target  沒有設定大小  

          那麼 pga_aggregate_target 初始化值 =memory_target-sga_target

sga_target  沒有設定大小, pga_aggregate_target  設定大小  

          那麼 sga_target 初始化值 =memory_target-pga_aggregate_target

sga_target  pga_aggregate_target都沒有設定大小 Oracle 11g 將根據執行狀態自動分配大小。但在資料庫啟動時會有一個固定比例來分配:

        sga_target =memory_target *60%     pga_aggregate_target=memory_target *40%

2memory_target沒有設定或等於011g中預設為0

11g中預設為0則初始狀態下取消了 memory_target 的作用,完全和10g在記憶體管理上一致,完全向下相容。

   (也有三種情況來對 SGA PGA 的大小進行分配)

SGA_TARGET 設定值,則自動調節 SGA 中的 shared pool,buffer cache,redo logbuffer,java pool,larger pool記憶體區,PGA 則依賴 pga_aggregate_target 的大小單獨設定。 sga pga不能自動增長和自動縮小。

SGA_target PGA_AGGREGATE_TARGET 都沒有設定,SGA 中的各記憶體區大小都要明確設定,不能自動調整各記憶體區大小。PGA 不能自動增長和收縮。

memory_max_target設定而memory_target =0  這種情況和10g 一樣不使用記憶體自動管理

LEO1@LEO1> showparameter target

NAME                           TYPE        VALUE

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

archive_lag_target                  integer    0

db_flashback_retention_target        integer     1440

fast_start_io_target                 integer     0

fast_start_mttr_target               integer     0

memory_max_target                big integer  652M

memory_target                    big integer  652M

parallel_servers_target              integer     8

pga_aggregate_target               big integer  0

sga_target                        big integer  0

現在我們看到sga_targetpga_aggregate_target的值都是0,由oracle自動調整大小,memory_targetmemory_max_target的大小是652M

LEO1@LEO1>select * from v$memory_target_advice;    分析資料庫最佳記憶體大小

MEMORY_SIZE MEMORY_SIZE_FACTORESTD_DB_TIME ESTD_DB_TIME_FACTOR   VERSION

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

        489                .75         5522              1.0002          0

        652                  1         5521                  1         0

        815               1.25         5518               .9994          0

        978                1.5         5517               .9993          0

       1141               1.75         5517               .9992          0

       1304                  2         5517               .9992          0

MEMORY_SIZEoracle建議的記憶體大小

MEMORY_SIZE_FACTOR:記憶體基線因子,0.25, 0.5, 0.75, 1, 1.5, 1.75, and 2

ESTD_DB_TIMEForcurrent memory size (MEMORY_SIZE_FACTOR = 1), the amount of database time requiredto complete the current workload. For a proposed memory size, the estimatedamount of database time that would be required if the MEMORY_TARGET parameterwere changed to the proposed size.(官方文件解釋)

當記憶體基線因子為1時,完成當前資料庫工作量所需要的所有資料庫時間(即所有使用者消耗的資料庫時間),這是一個建議值,它會根據memory_target引數的改變而改變

ESTD_DB_TIME_FACTORFora proposed memory size, ratio of estimated database time to current databasetime(官方文件解釋)

消耗資料庫時間的比例因子

VERSIONVersionnumber of this recommendation (this snapshot of the V$MEMORY_TARGET_ADVICE view

v$memory_target_advice這個檢視快照的版本號

1.memory_target=489M時,ESTD_DB_TIME=5522

2.memory_target=652M時,ESTD_DB_TIME=5521    當前值

3.memory_target=815M時,ESTD_DB_TIME=5518

4.memory_target=978M時,ESTD_DB_TIME=5517

5.memory_target=1141M時,ESTD_DB_TIME=5517

6.memory_target=1304M時,ESTD_DB_TIME=5517

從如上的系統資源消耗情況來看,memory_target=489M是之前652M的四分之三,但ESTD_DB_TIME才增加了1價效比非常高,我們可以把memory_target=修改成489M,節約我們的記憶體資源

LEO1@LEO1>alter system set memory_max_target=489m scope=spfile;

System altered.

LEO1@LEO1>alter system set memory_target=489m scope=spfile;

System altered.

LEO1@LEO1> showparameter target

NAME                           TYPE        VALUE

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

archive_lag_target                  integer    0

db_flashback_retention_target        integer     1440

fast_start_io_target                 integer     0

fast_start_mttr_target               integer     0

memory_max_target                big integer  652M

memory_target                    big integer  652M

parallel_servers_target              integer     8

pga_aggregate_target               big integer  0

sga_target                        big integer  0

現在只是修改了spfile引數檔案的內容,需要重啟資料庫才生效

LEO1@LEO1>shutdown immediate   

ORA-01031:insufficient privileges       許可權不足

LEO1@LEO1> conn/ as sysdba         切換sys使用者

Connected.

SYS@LEO1>shutdown immediate       關閉例項

Database closed.

Databasedismounted.

ORACLE instanceshut down.

SYS@LEO1>startup

ORACLE instancestarted.

Total SystemGlobal Area  513585152 bytes

Fixed Size                  2214856 bytes

Variable Size             314573880 bytes

DatabaseBuffers          188743680 bytes

Redo Buffers                8052736 bytes

Database mounted.

Database opened.

SYS@LEO1> showparameter target

NAME                                 TYPE        VALUE

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

archive_lag_target                  integer    0

db_flashback_retention_target        integer     1440

fast_start_io_target                 integer     0

fast_start_mttr_target               integer     0

memory_max_target                big integer  492M     oracle做了一點點修正

memory_target                    big integer  492M     

parallel_servers_target              integer     8

pga_aggregate_target               big integer  0

sga_target                        big integer  0

小結:我們可以根據v$memory_target_advice檢視來合理的調整memory_target的記憶體值,提高資源利用率。

3.透過調整引數optimizer_index_cost_adj的大小,演示SQL產生不同執行計劃

Optimizer_index_cost_adj:這個引數是用於CBO在計算索引成本時的權重修正值

Optimizer_index_cost_adj的值越高,使用索引的機率越低,CBO傾向於全表掃描

Optimizer_index_cost_adj的值越低,使用索引的機率越高,CBO傾向於走索引

Optimizer_index_cost_adj預設值為100

SYS@LEO1> showparameter optimizer_index_cost_adj;  

NAME                                 TYPE        VALUE

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

optimizer_index_cost_adj                 integer    100

實驗

LEO1@LEO1> droptable leo1 purge;         清理環境

Table dropped.

LEO1@LEO1>create table leo1 as select * from dba_objects where rownum<200; 建立leo1199條記錄

Table created.

LEO1@LEO1>create index idx_leo1 on leo1(object_id);     建立idx_leo1 B-tree索引

Index created.

我們來看一下當optimizer_index_cost_adj=100時執行計劃

LEO1@LEO1> setautotrace trace explain

LEO1@LEO1>select * from leo1;

Execution Plan

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

Plan hash value:2716644435

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

| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |

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

|   0 | SELECT STATEMENT  |     |   199 | 41193 |     3  (0)| 00:00:01 |

|   1 | TABLE ACCESS FULL |  LEO1 |  199 | 41193 |     3   (0)| 00:00:01 |

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

走的是全表掃描,此時我們只發生了19次一致性讀,只掃描資料塊沒有掃描索引塊

Statistics

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

          0 recursive calls

          0 db block gets

         19 consistent gets                產生19個一致性讀

          0 physical reads

          0 redo size

      20823 bytes sent via SQL*Net to client

        667 bytes received via SQL*Net from client

         15 SQL*Net roundtrips to/from client

          0 sorts (memory)

          0 sorts (disk)

        199 rows processed

LEO1@LEO1>alter session set optimizer_index_cost_adj=10;  100修改成10

Session altered.

當這個引數越小時,CBO更傾向於走索引

LEO1@LEO1>select * from leo1 where object_id<=800;

Execution Plan

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

Plan hash value:1434365503

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

| Id  | Operation                   | Name     | Rows | Bytes | Cost (%CPU)| Time     |

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

|   0 | SELECT STATEMENT            |         |   199 | 41193 |     1  (0)| 00:00:01 |

|   1 | TABLE ACCESS BY INDEX ROWID | LEO1     |   199| 41193 |     1   (0)| 00:00:01 |

|*  2 |  INDEX RANGE SCAN         |IDX_LEO1  |   199 |     |     1  (0)| 00:00:01 |

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

走的是索引,此時我們發生了32次一致性讀,先掃描索引塊然後根據rowid掃描資料塊

Statistics

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

          0 recursive calls

          0 db block gets

         32 consistent gets             產生32個一致性讀

          0 physical reads

          0 redo size

      20823 bytes sent via SQL*Net to client

        667 bytes received via SQL*Net from client

         15 SQL*Net roundtrips to/from client

          0 sorts (memory)

          0  sorts(disk)

        199 rows processed

小結:相同結果集我們在走索引的時候比全表掃描產生的一致性讀要多,說明發生的邏輯IO次數更多了,消耗的系統IO資源更多了,這是不合理的,我們應該在生產中進行避免。


4.透過設定引數DB_FILE_MULTIBLOCK_READ_COUNT不同的值,演示對SQL效率的影響

db_file_multiblock_read_count:這個初始化引數叫做“一次讀多少個資料塊or一次多塊讀可以讀幾個資料塊”。這個引數值並不是無限大的,大多數平臺下的oracle都是128。一般oracle block size =8k

128*8=1M,也就是說1M是大多數作業系統一次最大IO的限制,如果還有其他限制要從這1M裡面扣除,初始化引數db_file_multiblock_read_count的最大值之所以定為128,也是為了保守策略。

場景:

1)全表掃描FTSFULL TABLE SCAN):這時oracle支援多塊讀

2)索引快速全掃描IFFSINDEX FAST FULL SCAN):索引並行讀取的時候也支援多塊讀

3OLAP:可以設定的大一些,但不是越大越好

4)還會受到作業系統IO本身的限制

實驗

LEO1@LEO1> droptable leo2 purge;                      清理環境

Table dropped.

LEO1@LEO1> droptable leo3 purge;

Table dropped.

LEO1@LEO1>create table leo2 as select * from dba_objects; 建立leo2

Table created.

LEO1@LEO1>create table leo3 as select * from dba_objects; 建立leo3

Table created.

LEO1@LEO1>create index idx_leo3 on leo3(object_id);      建立idx_leo3索引

Index created.

LEO1@LEO1>select segment_name,segment_type,bytes/1024/1024 from user_segments where segment_namein ('LEO2','LEO3','IDX_LEO3');

SEGMENT_NAME     SEGMENT_TYPE       BYTES/1024/1024

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

IDX_LEO3           INDEX               2

LEO3               TABLE              9

LEO2               TABLE               9

LEO2表大小是9M(段頭+資料),LEO3表大小9+2=11M(表+索引)

LEO1@LEO1>alter session set db_file_multiblock_read_count=16;  設定一次多塊讀可以讀16個資料塊

Session altered.

LEO1@LEO1> showparameter db_file_multiblock_read_count    16*8k=128k

NAME                                 TYPE        VALUE

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

db_file_multiblock_read_count             integer     16

LEO1@LEO1>select count(*) from leo2;

Execution Plan

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

Plan hash value:3963694794

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

| Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |

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

|   0 | SELECT STATEMENT   |     |     1 |   233  (1)| 00:00:03 |

|   1 | SORT AGGREGATE   |      |    1 |            |          |

|   2 |  TABLE ACCESS FULL | LEO2 | 73470 |  233   (1)| 00:00:03 |

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

Statistics

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

        210 recursive calls

          0 db block gets

       1119 consistent gets

       1025 physical reads

          0 redo size

        528 bytes sent via SQL*Net to client

        524 bytes received via SQL*Net from client

          2 SQL*Net roundtrips to/from client

          5 sorts (memory)

          0 sorts (disk)

          1 rows processed

一般執行2遍,統計資訊會穩定下來

LEO1@LEO1>select count(*) from leo2;

Execution Plan

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

Plan hash value:3963694794

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

| Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |

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

|   0 | SELECT STATEMENT   |     |     1 |   233  (1)| 00:00:03 |

|   1 | SORT AGGREGATE   |      |    1 |            |          |

|   2 |   TABLE ACCESS FULL | LEO2 | 73470 |   233  (1)| 00:00:03 |

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

全表掃描會使用多塊讀

Statistics

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

          0 recursive calls

          0 db block gets

       1030 consistent gets             1030*8K=8240k約等於9M

          0 physical reads

          0 redo size

        528 bytes sent via SQL*Net to client

        524 bytes received via SQL*Net from client

          2 SQL*Net roundtrips to/from client

          0 sorts (memory)

          0 sorts (disk)

          1 rows processed

我們在用1030/16=64.375次,oracle需要讀取64.375IO,才能把所有記錄讀取完。

LEO1@LEO1> selectcount(object_id) from leo3;

Execution Plan

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

Plan hash value:3677630522

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

| Id  | Operation             | Name     | Rows | Bytes | Cost (%CPU)| Time     |

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

|   0 | SELECT STATEMENT      |         |     1 |    13 |   40   (0)| 00:00:01 |

|   1 | SORT AGGREGATE       |          |    1 |    13 |            |          |

|   2 |  INDEX FAST FULL SCAN| IDX_LEO3 | 71702 |   910K|   40   (0)| 00:00:01 |

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

Statistics

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

          4 recursive calls

          0 db block gets

        236 consistent gets

        160 physical reads

          0 redo size

        536 bytes sent via SQL*Net to client

        524 bytes received via SQL*Net from client

          2 SQL*Net roundtrips to/from client

          0 sorts (memory)

          0 sorts (disk)

          1 rows processed

執行2

LEO1@LEO1> selectcount(object_id) from leo3;

Execution Plan

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

Plan hash value:3677630522

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

| Id  | Operation            | Name     | Rows | Bytes | Cost (%CPU)| Time     |

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

|   0 | SELECT STATEMENT      |         |     1 |    13 |   40   (0)| 00:00:01 |

|   1 | SORT AGGREGATE       |         |     1 |    13 |            |          |

|   2 |   INDEX FAST FULL SCAN| IDX_LEO3 | 71702 |   910K|   40   (0)| 00:00:01 |

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

索引快速全掃描會使用多塊讀

Statistics

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

          0 recursive calls

          0 db block gets

        168 consistent gets                     168*8k=1344k約等於2M

          0 physical reads

          0 redo size

        536 bytes sent via SQL*Net to client

        524 bytes received via SQL*Net from client

          2 SQL*Net roundtrips to/from client

          0 sorts (memory)

          0 sorts (disk)

          1 rows processed

我們在用168/16=10.5次,oracle需要讀取10.5IO,才能計算出最後結果

LEO1@LEO1> setautotrace off

LEO1@LEO1>alter session set db_file_multiblock_read_count=128;設定一次多塊讀可以讀128個資料塊

Session altered.

LEO1@LEO1> showparameter db_file_multiblock_read_count    128*8k=1M

NAME                                 TYPE        VALUE

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

db_file_multiblock_read_count             integer      128

LEO1@LEO1> setautotrace traceonly

LEO1@LEO1>select count(*) from leo2;

Execution Plan

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

Plan hash value:3963694794

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

| Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |

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

|   0 | SELECT STATEMENT   |     |     1 |   185  (1)| 00:00:03 |

|   1 | SORT AGGREGATE    |     |    1 |            |          |

|   2 |   TABLE ACCESS FULL| LEO2  | 73470 |  185   (1)| 00:00:03 |

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

引數調整後cost從原來233減少到185IO代價減少了,說明引數生效了

Statistics

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

          0 recursive calls

          0 db block gets

       1030 consistent gets                    1030/128=8.04IO

          0 physical reads

          0 redo size

        528 bytes sent via SQL*Net to client

        524 bytes received via SQL*Net from client

          2 SQL*Net roundtrips to/from client

          0 sorts (memory)

          0 sorts (disk)

          1 rows processed

我們在用1030/128=8.04次,oracle從讀取64.375次減少到8.04次,IO資源消耗大大降低,SQL效率提高不少。

LEO1@LEO1> selectcount(object_id) from leo3;

Execution Plan

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

Plan hash value:3677630522

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

| Id  | Operation             | Name     | Rows | Bytes | Cost (%CPU)| Time     |

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

|   0 | SELECT STATEMENT      |         |     1 |    13|    32  (0)| 00:00:01 |

|   1 | SORT AGGREGATE      |          |    1 |    13 |            |          |

|   2 |   INDEX FAST FULL SCAN  |IDX_LEO3 | 71702 |   910K|    32  (0)| 00:00:01 |

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

索引快速全掃描cost從原來40減少到32IO代價也減少了,說明引數生效了

Statistics

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

          0 recursive calls

          0 db block gets

        168 consistent gets                   168/128=1.3125

          0 physical reads

          0 redo size

        536 bytes sent via SQL*Net to client

        524 bytes received via SQL*Net from client

          2 SQL*Net roundtrips to/from client

          0 sorts (memory)

          0 sorts (disk)

          1  rowsprocessed

小結:oracle走索引從10.5次減少到1.3125次,IO次數大大降低,SQL讀取的效率自然就提高了。


5.示例說明資料庫中“會話”和“程式”之間的關係。

會話:指的是連線到資料庫的服務程式數,一般分為使用者會話 後臺程式會話 應用程式會話

注意:會話是面向資料庫的,我們從資料庫層面看就叫會話

程式:指的是作業系統層面發起的連線資料庫的程式數,不管連線成不成功就會增加一個程式

注意:程式是面向作業系統的,我們從作業系統層面看就叫程式

會話與程式的關係,官方文件推薦的設定公式

Oracle 10g 官方文件:SESSIONS=Derived: (1.1 * PROCESSES) + 5

Oracle 11g 官方文件:SESSIONS=Derived: (1.5 * PROCESSES) + 22

LEO1@LEO1> showparameter process

NAME                                 TYPE        VALUE

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

processes                            integer     150

LEO1@LEO1> showparameter session

NAME                                 TYPE        VALUE

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

sessions                             integer     248

(1.5*150)+22=247約等於248與官方文件的公式吻合

注意在10g11g中推薦的sessions數是不一樣的,大家知道為什麼嘛?留一個小題,第一個回答正確者獎勵100金哦,100金哦

Process可以等於session,也可以小於session,還可以大於session

實驗

LEO1@LEO1> colusername for a10

LEO1@LEO1> colosuser for a10

LEO1@LEO1> colprocess for a10

LEO1@LEO1>select sid,username,paddr,status,server,osuser,process,sql_id,machine fromv$session;

       SID USERNAME   PADDR            STATUS  SERVER    OSUSER     PROCESS   SQL_ID        MACHINE

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

         1            000000007E079BB0 ACTIVE   DEDICATED oracle     2903                     leonarding1.oracle.com

         2            000000007E07BC30 ACTIVE   DEDICATED oracle     2913                     leonarding1.oracle.com

         3            000000007E07DCB0 ACTIVE   DEDICATED oracle     2921                     leonarding1.oracle.com

         4            000000007E07FD30 ACTIVE   DEDICATED oracle     2929                     leonarding1.oracle.com

         5            000000007E081DB0 ACTIVE   DEDICATED oracle     2937                    leonarding1.oracle.com

         6            000000007E083E30 ACTIVE   DEDICATED oracle     2945                     leonarding1.oracle.com

         7            000000007E085EB0 ACTIVE   DEDICATED oracle     2953                     leonarding1.oracle.com

         8            000000007E087F30 ACTIVE   DEDICATED oracle     2961                     leonarding1.oracle.com

        10            000000007E08C030 ACTIVE   DEDICATED oracle     3013                     leonarding1.oracle.com

        15            000000007E090130 ACTIVE   DEDICATED oracle     3520                    leonarding1.oracle.com

        17            000000007E0921B0 ACTIVE   DEDICATED oracle     3528                     leonarding1.oracle.com

        19            000000007E09A3B0 ACTIVE   DEDICATED oracle     5226                     leonarding1.oracle.com

        23 SYSMAN     000000007E08E0B0 INACTIVE DEDICATEDoracle     1234                     leonarding1.oracle.com

        27            000000007E094230 ACTIVE   DEDICATED oracle     9266                     leonarding1.oracle.com

        28 LEO1       000000007E0962B0 ACTIVE   DEDICATED oracle     9596      71dh8u20z3x5w leonarding1.oracle.com

        30 SYSMAN     000000007E098330 INACTIVE DEDICATEDoracle     1234                     leonarding1.oracle.com

       126            000000007E07ABF0 ACTIVE   DEDICATED oracle     2907                     leonarding1.oracle.com

       127            000000007E07CC70 ACTIVE   DEDICATED oracle     2917                     leonarding1.oracle.com

       128            000000007E07ECF0 ACTIVE   DEDICATED oracle     2925                     leonarding1.oracle.com

       129            000000007E080D70 ACTIVE   DEDICATED oracle     2933                     leonarding1.oracle.com

       130            000000007E082DF0 ACTIVE   DEDICATED oracle     2941                     leonarding1.oracle.com

       131            000000007E084E70 ACTIVE   DEDICATED oracle     2949                     leonarding1.oracle.com

       132            000000007E086EF0 ACTIVE   DEDICATED oracle     2957                     leonarding1.oracle.com

       135 DBSNMP     000000007E08AFF0 INACTIVE DEDICATEDoracle     6064                     leonarding1.oracle.com

       139            000000007E091170 ACTIVE   DEDICATED oracle     3524                     leonarding1.oracle.com

       141            000000007E095270 ACTIVE   DEDICATED oracle     9653                     leonarding1.oracle.com

       147 DBSNMP     000000007E09D470 INACTIVE DEDICATED oracle     6064                     leonarding1.oracle.com

       148 DBSNMP     000000007E09F4F0 ACTIVE   DEDICATED oracle     6064                     leonarding1.oracle.com

       149            000000007E08F0F0 ACTIVE   DEDICATED oracle     6148                     leonarding1.oracle.com

       150 SYSMAN     000000007E0931F0 INACTIVE DEDICATEDoracle     1234                     leonarding1.oracle.com

       154            000000007E08D070 ACTIVE   DEDICATED oracle     9649                     leonarding1.oracle.com

       155 SYSMAN     000000007E0972F0 ACTIVE   DEDICATED oracle     1234      2b064ybzkwf1y leonarding1.oracle.com

我們剛開機有32個會話,下面解釋常用的幾個欄位

Sid:會話ID

Username:資料庫使用者名稱,我們這裡只有一個leo1使用者的會話

Paddr:程式地址

v$sessionv$process之間的關係:一個會話對應一個伺服器程式,透過地址關聯s.paddr=p.addr,p這樣就可以透過一個程式找到一個會話;或者透過一個會話,找到它的伺服器程式

status:會話狀態  active 活動狀態  inactive 未活動狀態

server:採用的連線方式  DEDICATED  專用連線方式   SHARED  共享連線方式

osuser:作業系統使用者名稱  我們使用的都是oracle

process:會話對應的程式號

sql_id:會話執行的SQL語句

machine:從哪臺機器上發出的會話連線  leonarding1.oracle.com  標識的是機器名

我們看process>session  開啟另一個命令視窗執行下面的操作

[oracle@leonarding1~]$ sqlplus /nolog

SQL*Plus: Release11.2.0.1.0 Production on Sat Mar 2 10:25:31 2013

Copyright (c)1982, 2009, Oracle.  All rights reserved.

@>   看到這個識別符號和之前有區別了吧(LEO1@LEO1>前面的leo1指的是當前使用者名稱後面的leo1指的資料庫例項名)現在什麼也沒有說明客戶端並沒有發起連線資料庫的請求,當然就沒有會話啦

sqlplus/nolog  是一種匿名登入,就是先進入sqlplus環境,但沒有連線資料庫,進入sqlplus就會產生程式

這時我們在看一下v$session內容沒有顯示新會話吧,還是隻有原來的leo1會話

LEO1@LEO1>select sid,username,paddr,status,server,osuser,process,sql_id,machine fromv$session;

       SID USERNAME   PADDR            STATUS   SERVER   OSUSER     PROCESS    SQL_ID        MACHINE

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

         1            000000007E079BB0 ACTIVE   DEDICATED oracle     2903                     leonarding1.oracle.com

         2            000000007E07BC30 ACTIVE   DEDICATED oracle     2913                     leonarding1.oracle.com

         3            000000007E07DCB0 ACTIVE   DEDICATED oracle     2921                     leonarding1.oracle.com

         4            000000007E07FD30 ACTIVE   DEDICATED oracle     2929                    leonarding1.oracle.com

         5            000000007E081DB0 ACTIVE   DEDICATED oracle     2937                     leonarding1.oracle.com

         6            000000007E083E30 ACTIVE   DEDICATED oracle     2945                     leonarding1.oracle.com

         7            000000007E085EB0 ACTIVE   DEDICATED oracle     2953                     leonarding1.oracle.com

         8            000000007E087F30 ACTIVE   DEDICATED oracle     2961                     leonarding1.oracle.com

        10           000000007E08C030 ACTIVE  DEDICATED oracle     3013                     leonarding1.oracle.com

        15            000000007E090130 ACTIVE   DEDICATED oracle     3520                     leonarding1.oracle.com

        17            000000007E0921B0 ACTIVE   DEDICATED oracle     3528                     leonarding1.oracle.com

        19            000000007E09A3B0 ACTIVE   DEDICATED oracle     5226                     leonarding1.oracle.com

        23 SYSMAN     000000007E08E0B0 ACTIVE   DEDICATED oracle     1234      8t43xdhf4d9x2 leonarding1.oracle.com

        28 LEO1       000000007E0962B0 ACTIVE   DEDICATED oracle     9596      71dh8u20z3x5w leonarding1.oracle.com

        30 SYSMAN     000000007E098330 INACTIVE DEDICATEDoracle     1234                     leonarding1.oracle.com

       126            000000007E07ABF0 ACTIVE   DEDICATED oracle     2907                     leonarding1.oracle.com

       127            000000007E07CC70 ACTIVE   DEDICATED oracle     2917                     leonarding1.oracle.com

       128            000000007E07ECF0 ACTIVE   DEDICATED oracle     2925                     leonarding1.oracle.com

       129            000000007E080D70 ACTIVE   DEDICATED oracle     2933                     leonarding1.oracle.com

       130            000000007E082DF0 ACTIVE   DEDICATED oracle     2941                     leonarding1.oracle.com

       131            000000007E084E70 ACTIVE   DEDICATED oracle     2949                     leonarding1.oracle.com

       132            000000007E086EF0 ACTIVE   DEDICATED oracle     2957                     leonarding1.oracle.com

       135 DBSNMP     000000007E08AFF0 INACTIVE DEDICATEDoracle     6064       a8j39qb13tqkr leonarding1.oracle.com

       139            000000007E091170 ACTIVE   DEDICATED oracle     3524                     leonarding1.oracle.com

       147 DBSNMP     000000007E09D470 INACTIVE DEDICATEDoracle     6064                     leonarding1.oracle.com

       148 DBSNMP     000000007E09F4F0 ACTIVE   DEDICATED oracle     6064                     leonarding1.oracle.com

       149            000000007E08F0F0 ACTIVE   DEDICATED oracle     6148                     leonarding1.oracle.com

       150 SYSMAN     000000007E0931F0 INACTIVE DEDICATEDoracle     1234                     leonarding1.oracle.com

       154            000000007E08D070 ACTIVE   DEDICATED oracle     15877                    leonarding1.oracle.com

       155 SYSMAN     000000007E0972F0 ACTIVE   DEDICATED oracle     1234      2b064ybzkwf1y leonarding1.oracle.com

下面我們在從作業系統層面來看

[oracle@leonarding1~]$ ps -ef | grep sqlplus            2sqlplus程式

oracle    9596 9565  0 09:59 pts/1    00:00:00 sqlplus       sqlplus leo1/leo1

oracle   16979 5229  0 10:49 pts/3    00:00:00 sqlplus       sqlplus /nolog

現在我們應該明白了吧,sqlplus /nolog操作沒有產生session,但是產生了process

@> exit                                           退出匿名登入

[oracle@leonarding1~]$ ps -ef | grep sqlplus             現在只剩下一個sqlplus程式啦

oracle    9596 9565  0 09:59 pts/1    00:00:00 sqlplus

完美呈現process>session

我們在來看process=session的情況,這種情況是最常見的,一個clientprocess發起連線請求後,資料庫的server process程式響應,形成一個連線通道,這個通道就是一個會話,如果clientprocess是一個使用者發起的,這個會話就叫“使用者會話”。如果clientprocess是一個後臺程式發起的,這個會話就叫“後臺程式會話”。如果clientprocess是一個應用程式發起的,這個會話就叫“應用程式會話”。

LEO1@LEO1>select sid,username,paddr,status,server,osuser,process,sql_id,machine fromv$session;

28 LEO1      000000007E0962B0 ACTIVE   DEDICATED oracle     9596       71dh8u20z3x5w leonarding1.oracle.com

一個client process發起連線請求後,就會在作業系統層面生成一個程式9596,即sqlplus發起。這在v$session中可以顯示出來了

[oracle@leonarding1~]$ ps -ef | grep sqlplus

oracle    9596 9565  0 09:59 pts/1    00:00:00 sqlplus  

資料庫的一個server process程式響應(它們是一一對應的)

LEO1@LEO1>select s.sid,s.username,s.process,p.spid from v$session s,v$process p wheres.paddr=p.addr and p.addr='000000007E0962B0';

       SID USERNAME   PROCESS   SPID

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

        28 LEO1        9596      16065

v$session v$process聯合檢視顯示9596程式由16065程式進行響應,我們從作業系統層面來看看是不是這樣

[oracle@leonarding1~]$ ps -ef | grep 16065

oracle   16065 9596  0 10:37 ?        00:00:00 oracleLEO1(DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))

沒有問題,並且還告訴你這個會話是本地連線(LOCAL=YES)並非遠端伺服器連線過來的

完美呈現process=session

我們在來看process的情況,這種情況非常少見,一個process對應兩個session

LEO1@LEO1>select s.sid,s.username,s.process,p.spid,s.paddr session_paddr,p.addrprocess_addr from v$session s,v$process p where s.paddr=p.addr ands.paddr='000000007E0962B0';

SID  USERNAME PROCESS    SPID         SESSION_PADDR     PROCESS_ADDR

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

22   LEO1       9596       16065        000000007E0962B0 000000007E0962B0

28   LEO1       9596      16065        000000007E0962B0 000000007E0962B0

我們透過SESSION_PADDRPROCESS_ADDR欄位的process地址關聯,看到了一個process對連線兩個session,原來我們說它們應該是11對應的,現在形成了12,這是為什麼呢?

Statistics

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

         15 recursive calls

          0 db block gets

          4 consistent gets

          0 physical reads

          0 redo size

        981 bytes sent via SQL*Net to client

        523 bytes received via SQL*Net from client

          2 SQL*Net roundtrips to/from client

          1 sorts (memory)

          0 sorts (disk)

          2 rows processed

仔細的筒子們發現下面列印出了SQL語句的統計資訊,這個統計資訊是誰來列印出來的呢?呼呼哈嘿

上面檢視中是不是多出了22會話,這個會話就是列印統計資訊的始作俑者。那麼筒子們會問22會話和28會話是什麼關係呢?

答:oracle在執行28會話的時候另外產生22會話,22會話會獲取28會話的統計資訊列印出來,也就是說22會話是為28會話服務的,由此產生了一對process滋生出兩個session,形成process的情況。



6.演示透過動態檢視檢視某個會話的等待事件。

v$session:會話當前的各種狀態和屬性,例如如上我們寫的一些會話屬性

v$session_wait:會話當前等待事件的詳細資訊

v$session_event:會話的所有等待事件的詳細資訊

v$sesstat:會話的資源統計資訊

當前會話id28

LEO1@LEO1>select distinct sid from v$mystat;

       SID

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

        28

LEO1@LEO1>select sid,event,state from v$session_wait where sid=28;   目前沒有等待事件

SID    EVENT                         STATE

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

28    SQL*Net message to client         WAITED SHORT TIME

LEO1@LEO1> droptable leo4 purge;                               清空環境

Table dropped.

LEO1@LEO1>create table leo4 as select * from dba_objects;            建立leo4

Table created.

LEO1@LEO1>select count(*) from leo4;                             一共72010

  COUNT(*)

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

     72010

LEO1@LEO1> droptable leo5 purge;                              

Table dropped.

LEO1@LEO1>create table leo5 as select * from dba_objects;           建立leo5

Table created.

LEO1@LEO1> altersystem flush buffer_cache;        清空data_buffer_cache好顯示等待事件

System altered.

LEO1@LEO1>select leo4.* from leo4,leo5 where leo4.object_name=leo5.object_name;

Execution Plan

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

Plan hash value:1968989376

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

| Id  | Operation          | Name | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |

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

|   0 | SELECT STATEMENT   |     |   119K|    13M|      |  1073  (1)| 00:00:13 |

|*  1 | HASH JOIN         |      |  119K|    13M|  2608K| 1073   (1)| 00:00:13 |

|   2 |   TABLE ACCESS FULL| LEO5 | 72009 |  1758K|      |   287   (1)| 00:00:04 |

|   3 |   TABLE ACCESS FULL| LEO4 | 72010 |  6821K|      |   287   (1)| 00:00:04 |

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

全表掃描會產生db file sequential read等待事件

LEO1@LEO1>begin

for leo in1..10000 loop

execute immediate'select leo4.* from leo4,leo5 where leo4.object_name=leo5.object_name';

execute immediate'alter system flush buffer_cache';

end loop;

end;

/

  2   3    4    5   6    7  

PL/SQL proceduresuccessfully completed.

v$session_wait顯示會話28當前存在的等待事件

LEO1@LEO1>select sid,event,wait_class from v$session_wait where event like '%db filesequential read%';

SID   EVENT                   WAIT_CLASS  

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

28    dbfile sequential read      UserI/O      

SID28  會話號

EVENTdbfile sequential read     等待事件名

WAIT_CLASSUserI/O           使用者操作產生的IO等待事件

v$session_event顯示會話28所有的等待事件

LEO1@LEO1>select sid,event,total_waits,total_timeouts,time_waited from v$session_eventwhere sid=28;

SID  EVENT                TOTAL_WAITS     TOTAL_TIMEOUTS    TIME_WAITED

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

28  Disk file operations I/O    12              0                  2

28  direct path sync          1              0                 8

28  Data file init write        12             0                  37

28  control file sequential read     24         0                  0

28  control file parallel write       3           0                 1

28  latch: cache buffers chains      2           0                 0

28  enq: RO - fast object reuse      3          0                  0

28  log file switch (private strand flushincomplete)    1             0           0

28  log file sync             15               0                7

28  db file sequential read    181415          0                 1522

等待了181415次,耗時1522

28  db file scattered read     138              0                 20

28  db file single write       1               0                 0

28  direct path write         83              0                 86

28  SQL*Net message to client      738       0                 2

28  SQL*Net message from client    737       0                 881451

28  SQL*Net break/reset to client    19        0                 151

28  events in waitclass Other        60133     114              30468

v$sesstat顯示會話28不同資源的統計資訊

LEO1@LEO1>select * from v$sesstat where sid=28;

   28       158        250

        28        159          0

        28        160          0

        28        161       1492

        28       162          0

        28        163     61540

        28        164    445088

        28        165          0

        28        166          0

        28        167          0

        28        168    128664

        28        169  44444100

        28        170          0

        28        171          0

        28        172       4316

小結:到此我們的Oracle 初始化引數&效能檢視章節實驗完畢,大家對這兩方面都有了深刻的理解了吧!請牢記我們常用的效能檢視幫助我們提高運維管理的質量和自動化。

好系統:合理架構+優良SQL+完善物件建模+精準初始化引數(10%


memory_target  v$memory_target_advice  optimizer_index_cost_adj  db_file_multiblock_read_count  v$process  v$session



2013.3.2
天津&spring
分享技術~成就夢想

Blog

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26686207/viewspace-755163/,如需轉載,請註明出處,否則將追究法律責任。

相關文章