Oracle12c(12.1)中效能最佳化&功能增強之透過引數THREADED_EXECTION使用多執行緒模型
1. 後臺
UNIX/Linux系統上,oracle用多程式模型。例如:linux上一個常規安裝的資料庫會有如下程式列:
$ ps -ef | grep [o]ra_
oracle 15356 1 0 10:53 ? 00:00:00 ora_pmon_db12c
oracle 15358 1 0 10:53 ? 00:00:00 ora_psp0_db12c
oracle 15360 1 8 10:53 ? 00:01:27 ora_vktm_db12c
oracle 15364 1 0 10:53 ? 00:00:00 ora_gen0_db12c
oracle 15366 1 0 10:53 ? 00:00:00 ora_mman_db12c
oracle 15370 1 0 10:53 ? 00:00:00 ora_diag_db12c
oracle 15372 1 0 10:53 ? 00:00:00 ora_dbrm_db12c
oracle 15374 1 0 10:53 ? 00:00:00 ora_dia0_db12c
oracle 15376 1 0 10:53 ? 00:00:00 ora_dbw0_db12c
oracle 15378 1 010:53 ? 00:00:00 ora_lgwr_db12c
oracle 15380 1 0 10:53 ? 00:00:00 ora_ckpt_db12c
oracle 15382 1 0 10:53 ? 00:00:00 ora_smon_db12c
oracle 15384 1 0 10:53 ? 00:00:00 ora_reco_db12c
oracle 15386 1 0 10:53 ? 00:00:00 ora_lreg_db12c
oracle 15388 1 0 10:53 ? 00:00:03 ora_mmon_db12c
oracle 15390 1 0 10:53 ? 00:00:00 ora_mmnl_db12c
oracle 15392 1 0 10:53 ? 00:00:00 ora_d000_db12c
oracle 15394 1 010:53 ? 00:00:00 ora_s000_db12c
oracle 15407 1 0 10:54 ? 00:00:00 ora_tmon_db12c
oracle 15409 1 0 10:54 ? 00:00:00 ora_tt00_db12c
oracle 15411 1 0 10:54 ? 00:00:00 ora_smco_db12c
oracle 15413 1 0 10:54 ? 00:00:00 ora_fbda_db12c
oracle 15415 1 0 10:54 ? 00:00:00 ora_aqpc_db12c
oracle 15419 1 0 10:54 ? 00:00:00 ora_p000_db12c
oracle 15421 1 0 10:54 ? 00:00:00 ora_p001_db12c
oracle 15423 1 0 10:54 ? 00:00:00 ora_p002_db12c
oracle 15425 1 0 10:54 ? 00:00:00 ora_p003_db12c
oracle 15435 1 0 10:54 ? 00:00:00 ora_cjq0_db12c
oracle 15459 1 0 10:54 ? 00:00:00 ora_qm02_db12c
oracle 15463 1 0 10:54 ? 00:00:00 ora_q002_db12c
oracle 15465 1 0 10:54 ? 00:00:00 ora_q003_db12c
oracle 15612 1 0 11:04 ? 00:00:00 ora_w000_db12c
oracle 15679 1 0 11:10 ? 00:00:00 ora_j000_db12c
oracle 15681 1 0 11:10 ? 00:00:00 ora_j001_db12c
oracle 15683 1 0 11:10 ? 00:00:00 ora_w001_db12c
$
即使在多程式模型中,某些個別程式內部執行在多執行緒模式。
相反,在windows系統上,Oracle資料庫作為一個多執行緒程式執行,而每個UNIX/Linux下的程式作為一個或多個執行緒執行。Oracle12c可以在UNIX/Linux上執行在多執行緒模式下,就像執行在window上那樣。
2. THREADED_EXECUTION引數
執行緒模型透過初始化引數THREADED_EXECUTION指定。
1) THREADED_EXECUTION=FALSE:為預設值,oracle執行在多程式模式下。
2) THREADED_EXECUTION=TRUE: Oracle以多執行緒模式執行。
如果想切換到多執行緒模式,只需設定THREADED_EXECUTION引數並重啟資料庫就可以。
CONN sys AS SYSDBA
ALTER SYSTEM SET threaded_execution=TRUESCOPE=SPFILE;
SHUTDOWN IMMEDIATE;
STARTUP;
一旦資料庫被重啟,我們會發現作業系統程式數減少了很多。
$ ps -ef | grep [o]ra_
oracle 15839 1 0 11:26 ? 00:00:00 ora_pmon_db12c
oracle 15841 1 0 11:26 ? 00:00:00 ora_psp0_db12c
oracle 15843 1 8 11:26 ? 00:00:03 ora_vktm_db12c
oracle 15847 1 0 11:26 ? 00:00:00 ora_u004_db12c
oracle 15853 1 34 11:26 ? 00:00:13 ora_u005_db12c
oracle 15859 1 0 11:26 ? 00:00:00 ora_dbw0_db12c
$
另外,需將如下引數新增至"$ORACLE_HOME/network/admin/listener.ora"檔案中,以允許產生新執行緒來支援監聽產生的連線,記得要用正確監聽名替換<listener-name>
DEDICATED_THROUGH_BROKER_<listener-name>=ON
當需要切換回多程式模型時,只需切換該初始化引數值並重啟資料庫。
CONN sys AS SYSDBA
ALTER SYSTEM SET threaded_execution=FALSESCOPE=SPFILE;
SHUTDOWN IMMEDIATE;
STARTUP;
記得清楚"listener.ora"檔案中的引數。
3. OS認證
多執行緒模型不支援OS認證,這是一個特點而不是bug。看前面的例子,使用執行緒模型時,透過"SYS ASSYSDBA"而不是 "/ AS SYSDBA"連線資料庫。試著以OS認證連線庫會報錯。
$ sqlplus / as sysdba
SQL*Plus: Release 12.1.0.1.0 Production onThu Jul 4 11:28:16 2013
Copyright (c) 1982, 2013, Oracle. All rights reserved.
ERROR:
ORA-01017: invalid username/password;logon denied
Enter user-name: sys as sysdba
Enter password:
Connected to:
Oracle Database 12c Enterprise EditionRelease 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, AdvancedAnalytics and Real Application Testing options
SQL>
文件上說會報錯ORA-01031 "insufficientprivileges" 。
4. 殺會話
檢視V$PROCESS包括一個叫STID的新列,該列顯示會話的執行緒ID。
SET LINESIZE 140
COLUMN username FORMAT A15
COLUMN osuser FORMAT A15
COLUMN spid FORMAT A10
COLUMN stid FORMAT A10
SELECT s.username,
s.osuser,
s.sid,
s.serial#,
p.spid,
p.stid,
s.status
FROM v$session s,
v$process p
WHERE s.paddr = p.addr
AND s.username IS NOT NULL
ORDER BY s.username, s.osuser;
USERNAME OSUSER SID SERIAL# SPID STID STATUS
--------------- --------------- -------------------- ---------- ---------- --------
SYS oracle 35 3 18844 18901 ACTIVE
TEST oracle 40 37 18844 19020 INACTIVE
SQL>
在Oracle內殺會話的方法沒變,因為你還是可以找到SID和SERIAL#。
SQL> ALTER SYSTEM KILL SESSION '40,37';
System altered.
SQL>
但一定不要用UNIX/Linux命令殺掉會話程式(SPID)對應的OS程式,否則,我們會殺掉多個會話,而不是我們真正想殺的會話。
$ ps -ef | grep 18844 | grep -v grep
oracle 18844 1 1 16:27 ? 00:00:22 ora_u005_db12c
$
5. 總結
1) 使用該特點的唯一可信理由是將多個例項整合到一個伺服器上,同時,沒用多宿主資料庫選項。因為,如果不用多執行緒模型,OS程式數將會很高。
2) 如果你的硬體架構相對程式而言,更適合處理執行緒,那麼,該特點也許會帶來一些好處。
3) RAC環境中,各節點必須都用同樣的執行緒模型。
UNIX/Linux系統上,oracle用多程式模型。例如:linux上一個常規安裝的資料庫會有如下程式列:
$ ps -ef | grep [o]ra_
oracle 15356 1 0 10:53 ? 00:00:00 ora_pmon_db12c
oracle 15358 1 0 10:53 ? 00:00:00 ora_psp0_db12c
oracle 15360 1 8 10:53 ? 00:01:27 ora_vktm_db12c
oracle 15364 1 0 10:53 ? 00:00:00 ora_gen0_db12c
oracle 15366 1 0 10:53 ? 00:00:00 ora_mman_db12c
oracle 15370 1 0 10:53 ? 00:00:00 ora_diag_db12c
oracle 15372 1 0 10:53 ? 00:00:00 ora_dbrm_db12c
oracle 15374 1 0 10:53 ? 00:00:00 ora_dia0_db12c
oracle 15376 1 0 10:53 ? 00:00:00 ora_dbw0_db12c
oracle 15378 1 010:53 ? 00:00:00 ora_lgwr_db12c
oracle 15380 1 0 10:53 ? 00:00:00 ora_ckpt_db12c
oracle 15382 1 0 10:53 ? 00:00:00 ora_smon_db12c
oracle 15384 1 0 10:53 ? 00:00:00 ora_reco_db12c
oracle 15386 1 0 10:53 ? 00:00:00 ora_lreg_db12c
oracle 15388 1 0 10:53 ? 00:00:03 ora_mmon_db12c
oracle 15390 1 0 10:53 ? 00:00:00 ora_mmnl_db12c
oracle 15392 1 0 10:53 ? 00:00:00 ora_d000_db12c
oracle 15394 1 010:53 ? 00:00:00 ora_s000_db12c
oracle 15407 1 0 10:54 ? 00:00:00 ora_tmon_db12c
oracle 15409 1 0 10:54 ? 00:00:00 ora_tt00_db12c
oracle 15411 1 0 10:54 ? 00:00:00 ora_smco_db12c
oracle 15413 1 0 10:54 ? 00:00:00 ora_fbda_db12c
oracle 15415 1 0 10:54 ? 00:00:00 ora_aqpc_db12c
oracle 15419 1 0 10:54 ? 00:00:00 ora_p000_db12c
oracle 15421 1 0 10:54 ? 00:00:00 ora_p001_db12c
oracle 15423 1 0 10:54 ? 00:00:00 ora_p002_db12c
oracle 15425 1 0 10:54 ? 00:00:00 ora_p003_db12c
oracle 15435 1 0 10:54 ? 00:00:00 ora_cjq0_db12c
oracle 15459 1 0 10:54 ? 00:00:00 ora_qm02_db12c
oracle 15463 1 0 10:54 ? 00:00:00 ora_q002_db12c
oracle 15465 1 0 10:54 ? 00:00:00 ora_q003_db12c
oracle 15612 1 0 11:04 ? 00:00:00 ora_w000_db12c
oracle 15679 1 0 11:10 ? 00:00:00 ora_j000_db12c
oracle 15681 1 0 11:10 ? 00:00:00 ora_j001_db12c
oracle 15683 1 0 11:10 ? 00:00:00 ora_w001_db12c
$
即使在多程式模型中,某些個別程式內部執行在多執行緒模式。
相反,在windows系統上,Oracle資料庫作為一個多執行緒程式執行,而每個UNIX/Linux下的程式作為一個或多個執行緒執行。Oracle12c可以在UNIX/Linux上執行在多執行緒模式下,就像執行在window上那樣。
2. THREADED_EXECUTION引數
執行緒模型透過初始化引數THREADED_EXECUTION指定。
1) THREADED_EXECUTION=FALSE:為預設值,oracle執行在多程式模式下。
2) THREADED_EXECUTION=TRUE: Oracle以多執行緒模式執行。
如果想切換到多執行緒模式,只需設定THREADED_EXECUTION引數並重啟資料庫就可以。
CONN sys AS SYSDBA
ALTER SYSTEM SET threaded_execution=TRUESCOPE=SPFILE;
SHUTDOWN IMMEDIATE;
STARTUP;
一旦資料庫被重啟,我們會發現作業系統程式數減少了很多。
$ ps -ef | grep [o]ra_
oracle 15839 1 0 11:26 ? 00:00:00 ora_pmon_db12c
oracle 15841 1 0 11:26 ? 00:00:00 ora_psp0_db12c
oracle 15843 1 8 11:26 ? 00:00:03 ora_vktm_db12c
oracle 15847 1 0 11:26 ? 00:00:00 ora_u004_db12c
oracle 15853 1 34 11:26 ? 00:00:13 ora_u005_db12c
oracle 15859 1 0 11:26 ? 00:00:00 ora_dbw0_db12c
$
另外,需將如下引數新增至"$ORACLE_HOME/network/admin/listener.ora"檔案中,以允許產生新執行緒來支援監聽產生的連線,記得要用正確監聽名替換<listener-name>
DEDICATED_THROUGH_BROKER_<listener-name>=ON
當需要切換回多程式模型時,只需切換該初始化引數值並重啟資料庫。
CONN sys AS SYSDBA
ALTER SYSTEM SET threaded_execution=FALSESCOPE=SPFILE;
SHUTDOWN IMMEDIATE;
STARTUP;
記得清楚"listener.ora"檔案中的引數。
3. OS認證
多執行緒模型不支援OS認證,這是一個特點而不是bug。看前面的例子,使用執行緒模型時,透過"SYS ASSYSDBA"而不是 "/ AS SYSDBA"連線資料庫。試著以OS認證連線庫會報錯。
$ sqlplus / as sysdba
SQL*Plus: Release 12.1.0.1.0 Production onThu Jul 4 11:28:16 2013
Copyright (c) 1982, 2013, Oracle. All rights reserved.
ERROR:
ORA-01017: invalid username/password;logon denied
Enter user-name: sys as sysdba
Enter password:
Connected to:
Oracle Database 12c Enterprise EditionRelease 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, AdvancedAnalytics and Real Application Testing options
SQL>
文件上說會報錯ORA-01031 "insufficientprivileges" 。
4. 殺會話
檢視V$PROCESS包括一個叫STID的新列,該列顯示會話的執行緒ID。
SET LINESIZE 140
COLUMN username FORMAT A15
COLUMN osuser FORMAT A15
COLUMN spid FORMAT A10
COLUMN stid FORMAT A10
SELECT s.username,
s.osuser,
s.sid,
s.serial#,
p.spid,
p.stid,
s.status
FROM v$session s,
v$process p
WHERE s.paddr = p.addr
AND s.username IS NOT NULL
ORDER BY s.username, s.osuser;
USERNAME OSUSER SID SERIAL# SPID STID STATUS
--------------- --------------- -------------------- ---------- ---------- --------
SYS oracle 35 3 18844 18901 ACTIVE
TEST oracle 40 37 18844 19020 INACTIVE
SQL>
在Oracle內殺會話的方法沒變,因為你還是可以找到SID和SERIAL#。
SQL> ALTER SYSTEM KILL SESSION '40,37';
System altered.
SQL>
但一定不要用UNIX/Linux命令殺掉會話程式(SPID)對應的OS程式,否則,我們會殺掉多個會話,而不是我們真正想殺的會話。
$ ps -ef | grep 18844 | grep -v grep
oracle 18844 1 1 16:27 ? 00:00:22 ora_u005_db12c
$
5. 總結
1) 使用該特點的唯一可信理由是將多個例項整合到一個伺服器上,同時,沒用多宿主資料庫選項。因為,如果不用多執行緒模型,OS程式數將會很高。
2) 如果你的硬體架構相對程式而言,更適合處理執行緒,那麼,該特點也許會帶來一些好處。
3) RAC環境中,各節點必須都用同樣的執行緒模型。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8484829/viewspace-2120160/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle12c中效能最佳化&功能增強新特性之臨時undoOracle
- Oracle12c中功能及效能新特點之with子句的增強Oracle
- Java多執行緒之synchronized增強版——ReentrantLockJava執行緒synchronizedReentrantLock
- Oracle12c功能增強 新特性之管理功能的增強Oracle
- 多執行緒之共享模型執行緒模型
- java中如何給多執行緒中子執行緒傳遞引數?Java執行緒
- Oracle12c中效能最佳化&功能增強新特性之重大突破——記憶體列儲存新特性Oracle記憶體
- Android 效能最佳化之執行緒Android執行緒
- Spring Batch中透過多執行緒和非同步處理提高效能SpringBAT執行緒非同步
- java多執行緒之執行緒的基本使用Java執行緒
- Oracle12c中效能最佳化&功能增強新特性之全域性索引DROP和TRUNCATE 分割槽的非同步維護Oracle索引非同步
- C# 多執行緒引數傳遞C#執行緒
- Oracle12c 中RAC功能增強新特性之ASM&GridOracleASM
- Java多執行緒之記憶體模型Java執行緒記憶體模型
- Java 多執行緒共享模型之管程(上)Java執行緒模型
- Oracle12c中效能最佳化增強新特性之資料庫智慧快閃記憶體Oracle資料庫記憶體
- 多執行緒-執行緒控制之休眠執行緒執行緒
- 多執行緒-執行緒控制之加入執行緒執行緒
- 多執行緒-執行緒控制之禮讓執行緒執行緒
- 使用Actor模型管理Web Worker多執行緒模型Web執行緒
- ArcGISEngine中的多執行緒使用執行緒
- 使用多執行緒提高rest服務效能執行緒REST
- java多執行緒之消費生產模型Java執行緒模型
- Java多執行緒之執行緒中止Java執行緒
- 多執行緒系列之 執行緒安全執行緒
- iOS 多執行緒之執行緒安全iOS執行緒
- iOS多執行緒之執行緒安全iOS執行緒
- HttpClient引發的執行緒數過多導致應用崩潰HTTPclient執行緒應用崩潰
- 多執行緒-執行緒控制之守護執行緒執行緒
- .net使用Task多執行緒執行任務 .net限制執行緒數量執行緒
- 多執行緒中的使用共享變數的問題執行緒變數
- Android優化幀動畫過程中的多執行緒模型思考Android優化動畫執行緒模型
- 多執行緒使用執行緒
- 伺服器模型——從單執行緒阻塞到多執行緒非阻塞(中)伺服器模型執行緒
- Android多執行緒之執行緒池Android執行緒
- java多執行緒系列之執行緒池Java執行緒
- 多執行緒之Java記憶體模型(JMM)(一)執行緒Java記憶體模型
- 多執行緒之Runloop執行緒OOP