gdufo

           

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

           

          本視圖包含當前系統oracle運行的所有進程信息。常被用于將oracle或服務進程的操作系統進程ID與數據庫session之間建立聯系。在某些情況下非常有用:

           

          1.         如果數據庫瓶頸是系統資源(如:cpu,內存),并且占用資源最多的用戶總是停留在某幾個服務進程,那么進行如下諸項:

           

          l         找出資源進程

          l         找出它們的session,你必須將進程與會話聯系起來。

          l         找出為什么session占用了如此多的資源

           

          2.         SQL跟蹤文件名是基于服務進程的操作系統進程ID。要找出session的跟蹤文件,你必須將session與服務進程聯系起來。

          3.         某些事件,如rdbms ipc reply,鑒別session進程的Oracle進程ID在等什么。要發現這些進程在做什么,你必須找出它們的session。

          4.         你所看到的服務器上的后臺進程(DBWR,LGWR,PMON)都是服務進程。要想知道他們在做什么,你必須找到他們的session。

           

          V$PROCESS中的常用列

          l         ADDR:進程對象地址

          l         PIDoracle進程ID

          l         SPID:操作系統進程ID

           

          V$PROCESS中的連接列

          Column                       View                            Joined Column(s)

          ADDR                          V$SESSION                 PADDR

           

           

          示例:

          1.         查找指定系統用戶在oracle中的session信息及進程id,假設操作系統用戶為:junsansi

          select s.sid,s.SERIAL#, s.username,p.spid

            from v$session s, v$process p

           where s.osuser = 'junsansi'

             and s.PADDR = p.ADDR

           

          2.         查看鎖和等待

          SELECT /*+ rule */

           lpad(' ', decode(l.xidusn, 0, 3, 0)) || l.oracle_username User_name,

           o.owner,o.object_name,o.object_type,s.sid,s.serial#,p.spid

            FROM v$locked_object l, dba_objects o, v$session s, v$process p

           WHERE l.object_id = o.object_id

             AND l.session_id = s.sid and s.paddr = p.addr

           ORDER BY o.object_id, xidusn DESC

           

          3.          

           

           

          附注:

            在linux環境可以通過ps查看進程信息包括pid,windows中任務管理器的PIDv$processpid不能一一對應,這塊在oracleDocument中也沒有找到介紹,后來google了一下,有資料介紹說是由于windows是多線程服務器,每個進程包含一系列線程。這點于unix等不同,Unix每個Oralce進程獨立存在,在Nt上所有線程由Oralce進程衍生。

            要在windows中顯示oracle相關進程pid,我們可以通過一個簡單的sql語句來實現。

          SELECT s.SID, p.pid, p.spid signaled, s.osuser, s.program

            FROM v$process p, v$session s

           WHERE p.addr = s.paddr;

           

          SID

          PID

          SIGNALED

          OSUSER

          PROGRAM

          1

          2

          2452

          SYSTEM

          ORACLE.EXE

          2

          3

          2460

          SYSTEM

          ORACLE.EXE

          3

          4

          2472

          SYSTEM

          ORACLE.EXE

          4

          5

          2492

          SYSTEM

          ORACLE.EXE

          5

          6

          2496

          SYSTEM

          ORACLE.EXE

          6

          7

          2508

          SYSTEM

          ORACLE.EXE

          7

          8

          2520

          SYSTEM

          ORACLE.EXE

          8

          9

          2524

          SYSTEM

          ORACLE.EXE

          10

          12

          1316

          JSS\junsansi

          PlSqlDev.exe

          9

          13

          3420

          JSS\junsansi

          PlSqlDev.exe

          13

          14

          660

          JSS\junsansi

          PlSqlDev.exe

           

          還可以通過和 v$bgprocess 連接查詢到后臺進程的名字:

          SELECT s.SID SID, p.spid threadid, p.program processname, bg.NAME NAME

            FROM v$process p, v$session s, v$bgprocess bg

           WHERE p.addr = s.paddr

             AND p.addr = bg.paddr

             AND bg.paddr <> '00';

           

          SID

          THREADID

          PROCESSNAME

          NAME

          1

          2452

          ORACLE.EXE

          PMON

          2

          2460

          ORACLE.EXE

          DBW0

          3

          2472

          ORACLE.EXE

          LGWR

          4

          2492

          ORACLE.EXE

          CKPT

          5

          2496

          ORACLE.EXE

          SMON

          6

          2508

          ORACLE.EXE

          RECO

          7

          2520

          ORACLE.EXE

          CJQ0

          8

          2524

          ORACLE.EXE

          QMN0

           

          Eygle大師寫了一段sql腳本getsql.sql,用來獲取指定pid正在執行的sql語句,在此也附注上來。

          REM getsql.sql

          REM author eygle

          REM windows,已知進程ID,得到當前正在執行的語句

          REM windows,進程ID16進制,需要轉換,UNIX直接為10進制

          SELECT   /*+ ORDERED */

                   sql_text

              FROM v$sqltext a

             WHERE (a.hash_value, a.address) IN (

                      SELECT DECODE (sql_hash_value,

                                     0, prev_hash_value,

                                     sql_hash_value

                                    ),

                             DECODE (sql_hash_value, 0, prev_sql_addr, sql_address)

                        FROM v$session b

                       WHERE b.paddr = (SELECT addr

                                          FROM v$process c

                                         WHERE c.spid = TO_NUMBER ('&pid', 'xxxx')))

          ORDER BY piece ASC

          /

           

          posted on 2009-11-17 14:31 gdufo 閱讀(184) 評論(0)  編輯  收藏 所屬分類: Database (oracle, sqlser,MYSQL)

          導航

          統計

          常用鏈接

          留言簿(6)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          收藏夾

          Hibernate

          友情鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 德庆县| 友谊县| 定日县| 崇义县| 虎林市| 天气| 贵德县| 冀州市| 乳源| 启东市| 五寨县| 隆尧县| 石泉县| 鱼台县| 绥德县| 平塘县| 延津县| 白河县| 兴城市| 梅河口市| 环江| 墨竹工卡县| 曲阳县| 大冶市| 西安市| 香港| 凤翔县| 南京市| 兰西县| 民丰县| 教育| 绥化市| 彭泽县| 济阳县| 万宁市| 泰宁县| 灌云县| 河西区| 张掖市| 宝鸡市| 嘉禾县|