【原創】Oracle 初始化引數&效能檢視
《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_target:1.是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_target是memory_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 pool,redo log buffer 大小的,根據 Oracle 執行狀態來重新分配 SGA 各記憶體區大小。 PGA 在 10g 中需要單獨設定(即手工管理)。
實驗
下面我們透過以下的幾個命令來讓大家清楚memory_target 的設定與PGA和SGA的關係
(1)memory_target設定為非0值
Memory_Target=SGA_TARGET+PGA_AGGREGATE_TARGET ,大小等於memory_max_size 一致。
sga_target和pga_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%
(2)memory_target沒有設定或等於0(11g中預設為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_target和pga_aggregate_target的值都是0,由oracle自動調整大小,memory_target和memory_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_SIZE:oracle建議的記憶體大小
MEMORY_SIZE_FACTOR:記憶體基線因子,0.25, 0.5, 0.75, 1, 1.5, 1.75, and 2
ESTD_DB_TIME:Forcurrent 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_FACTOR:Fora proposed memory size, ratio of estimated database time to current databasetime(官方文件解釋)
消耗資料庫時間的比例因子
VERSION:Versionnumber 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; 建立leo1表199條記錄
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)全表掃描FTS(FULL TABLE SCAN):這時oracle支援多塊讀
(2)索引快速全掃描IFFS(INDEX FAST FULL SCAN):索引並行讀取的時候也支援多塊讀
(3)OLAP:可以設定的大一些,但不是越大越好
(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.375次IO,才能把所有記錄讀取完。
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.5次IO,才能計算出最後結果
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減少到185,IO代價減少了,說明引數生效了
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
1030 consistent gets 1030/128=8.04次IO
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減少到32,IO代價也減少了,說明引數生效了
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與官方文件的公式吻合
注意在10g和11g中推薦的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$session和v$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 有2個sqlplus程式
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
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_PADDR,PROCESS_ADDR欄位的process地址關聯,看到了一個process對連線兩個session,原來我們說它們應該是1:1對應的,現在形成了1:2,這是為什麼呢?
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:會話的資源統計資訊
當前會話id是28
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
SID:28 會話號
EVENT:dbfile sequential read 等待事件名
WAIT_CLASS:UserI/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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle初始化引數的來源Oracle
- 帶引數的檢視
- 檢視JVM執行時引數JVM
- 檢視JVM預設配置引數JVM
- Oracle RAC一鍵部署002(引數檢查)Oracle
- 2.7.11 檢視引數設定的方法
- 16 初始化引數
- win10怎樣檢視電腦配置引數_win10電腦配置引數檢視教程Win10
- 檢視JVM預設引數及微調JVM啟動引數JVM
- 如何檢視docker run啟動引數命令Docker
- 檢視oracle資料庫的連線數以及使用者檢視Oracle資料庫
- 2.6 指定初始化引數
- 2.7.5 SPFILE初始化引數
- Oracle 核心引數Oracle
- 【TUNE_ORACLE】Oracle檢查點(三)增量檢查點四個關鍵引數介紹Oracle
- 【TUNE_ORACLE】Oracle檢查點(二)檢查點效能Oracle
- 如何在MonogoDB中檢視配置的引數值MonoGo
- linux 檢視日誌的命令引數有哪些?Linux
- note1 : ubuntn 系統引數檢視命令
- Oracle 效能最佳化之核心的shmall 和shmmax 引數OracleHMM
- Oracle OCP(24):檢視Oracle
- 0607-引數初始化策略
- 原創文章檢測工具,檢測原創文章,過不了原創賬號的原因在這
- 原創文章檢測工具,原創文章檢測軟體,檢測文章相似度
- Oracle:PDB 引數管理Oracle
- Oracle普通檢視和物化檢視的區別Oracle
- CentOS下檢視nginx和php的編譯引數CentOSNginxPHP編譯
- v$parameter gv$parameter 檢視 DDL 與隱含引數
- MySQL 變數及效能狀態檢視知識技巧MySql變數
- oracle 檢視錶空間Oracle
- 11、Oracle中的檢視Oracle
- 2.6.9.1 關於 COMPATIBLE初始化引數
- 2.6.8.2 UNDO_TABLESPACE 初始化引數
- 2.6.8.1 UNDO_MANAGEMENT 初始化引數
- 2.6.2.2 初始化引數DB_DOMAINAI
- 2.6.2.1 初始化引數DB_NAME
- 2.6.1.1 初始化引數檔案示例
- 2.7.7 清除初始化引數的值
- 2.7.6 改變初始化引數值