Do you Know These 5 Use of V$session View ?

Do you Know These 5 Use of V$session View ?

 
 
V$session view is the base of all information related to current system status like which user, How many session, Which query and how long query is waiting etc. V$session is the first place when DBA start looking for information related to performance, query execution etc. You might be using this view 100 times in a day but did not realize its worth. By seeing importance of this view I decide to write few common use of V$session view in Oracle.

I am using Oracle 11g for all the queries and test cases, V$session is the view when you have single instance and GV$session is the view for Real Application Cluster instance.


1. List of running session: First thing DBA look into v$session is list of running database session, There are mainly two types of Database sessions Background and User sessions. Background session are used for database basic functionality like dbwr, arch, smon, pmon etc. User session are session which perform user operations.

Whenever you connect to the data a session is created into the database for performing your operations. A DBA can easily see this by using type field of V$session view.

SQL> select count(*),type from v$session group by type;
  COUNT(*) TYPE
---------- ----------
         1 USER
        49 BACKGROUND

Currently there are only one user session running. In case of RAC environment, DBA has to use gv$session instead of v$session.

SQL> select count(*),type,INST_ID from gv$session group by type,inst_id;
 COUNT(*) TYPE          INST_ID
---------- ---------- ----------
        21 USER                1
        48 BACKGROUND          1
        49 BACKGROUND          2
        17 USER                2

This is a two node RAC, Instance 1 has 21 user and 48 background sessions, while Instance 2 has 17 user and 49 background sessions. This information is useful when you see "ORA-00020: maximum number of processes (%s) exceeded" error. You can use below query to identify which use is creating high number of sessions.

SQL> select SID,USERNAME,COMMAND,PROCESS,TERMINAL,PROGRAM from gv$session where type='USER';
       SID USERNAME                          COMMAND PROCESS                  TERMINAL                       PROGRAM
---------- ------------------------------ ---------- ------------------------ ------------------------------ ------------------------------------------------
        16 SYS                                    47 17978                                                   oraagent.bin@dbarm2 (TNS V1-V3)
        19 DBSNMP                                  0 1234                     unknown                        JDBC Thin Client
        25 SYSMAN                                  0 1234                     unknown                        OMS
        26 DBSNMP                                  0 1234                     unknown                        JDBC Thin Client

From the above query SID is session ID, USERNAME is the name of database user, Process is the OS process number, Terminal is the name of system executing this query and program shows name of the program using this query. Terminal and Program is the most important field to find out culprit sessions in ORA-00020 errors.


2. Find Blocking Sessions: A common complain to Database Administrator by user is "my database connection is very slow". In this case DBA should check two things Either whole database is running slow or Only one user session is slow. To check whole database status DBA can use Top Command, OS Watcher and AWR Report

If you are sure that only single session is running slow then V$session or gv$session is parfect place to start. I have seen many cases where one session is blocking other session due to uncommitted transactions.

SQL> select sid, username,command,status,program,sql_id,BLOCKING_INSTANCE,BLOCKING_SESSION,WAIT_CLASS from gv$session where BLOCKING_SESSION is not null;
       SID USERNAME      COMMAND STATUS   PROGRAM                                          SQL_ID        BLOCKING_INSTANCE BLOCKING_SESSION WAIT_CLASS
---------- ---------- ---------- -------- ------------------------------------------------ ------------- ----------------- ---------------- ---------------
        47 SCOTT               6 ACTIVE   sqlplus@database.example.com (TNS V1-V3)         2rbwgj3zdsnus                 1               34 Application

In above Case, User scott was not getting any response from his query. I check using above query in which "BLOCKING_SESSION" shows the detail of session which is blocking scott user session.

SID,USERNAME,COMMAND,STATUS,PROGRAM and SQL_ID are scott use detail, BLOCKING_INSTANCE means at which instance blocking session is running, BLOCKING_SESSION is the session ID of blocking session.

Now next action plan for DBA is to check what is causing 34 to block scott session. DBA can use below query to figure out session 34 details.

SQL> select sid,username,command,status,program,sql_id,BLOCKING_INSTANCE,BLOCKING_SESSION,WAIT_CLASS from gv$session where sid=34;
       SID USERNAME      COMMAND STATUS   PROGRAM                                          SQL_ID        BLOCKING_INSTANCE BLOCKING_SESSION WAIT_CLASS
---------- ---------- ---------- -------- ------------------------------------------------ ------------- ----------------- ---------------- ---------------
        34 SCOTT               3 INACTIVE sqlplus@database.example.com (TNS V1-V3)         17d40vwcct4g6                                    Idle

Though,There could be many reasons for this kind of problem. One of them I have discussed here.


3. Investigate User Session Waits: I discussed a case in above point when one session is blocking other session. Suppose that is not the case then DBA has to look at wait events of the session. There are n number of possibilities for a session is waiting for and Database Administrator has to act accordingly. Using this query you can find out sessions waiting details:

SQL> select INST_ID,SID,USERNAME,COMMAND,WAIT_CLASS,WAIT_TIME,STATE WAIT_TIME_MICRO from gv$session;
   INST_ID        SID USERNAME                          COMMAND WAIT_CLASS                                                        WAIT_TIME WAIT_TIME_MICRO
---------- ---------- ------------------------------ ---------- ---------------------------------------------------------------- ---------- -------------------
         2          1                                         0 Idle                                                                      0 WAITING
         2          2                                         0 Idle                                                                      0 WAITING
         2          3                                         0 Idle                                                                      0 WAITING
         2          4                                         0 Idle                                                                      0 WAITING

For a single instance use v$session and remove INST_ID column. Idle, System I/O, Other, user I/O, Concurrency, Commit, Scheduler, Configuration, Application and Network are the main wait classes.
IF any session is waiting into "Concurrency" then DBA has to investigate immediately, If session is waiting into "Idle" it is not doing any operation.

If you found DB session waiting into any other wait event. Then you can further dig into using V$SESSION_EVENT.

SQL> select SID,EVENT,TIME_WAITED,TOTAL_WAITS from V$SESSION_EVENT where SID=205;
       SID EVENT                                                            TIME_WAITED TOTAL_WAITS
---------- ---------------------------------------------------------------- ----------- -----------
       205 Disk file operations I/O                                                   0           8
       205 latch: cache buffers chains                                                0           3
       205 buffer busy waits                                                        100           6
       205 gc buffer busy acquire                                                     1          15
       205 log file sync                                                            391       11798
       205 db file sequential read                                                    0           2
       205 db file scattered read                                                     1           6
       205 gc cr multi block request                                                  0           6
       205 gc cr block 2-way                                                        780       20897

In above query I am checking wait for a session having id 205. Above result shows all wait details for session 205. DBA can see "log file sync" is the event having highest total_waits. So DBA has to optimize database to reduce this wait event. Here are the ways to reduce log file sync and log file switch (checkpoint incomplete) wait events.

http://www.dbas-oracle.com/2011/08/how-to-resize-andor-add-redo-logs.html
http://www.dbas-oracle.com/2011/08/log-file-switch-checkpoint-incomplete.html


4. Find SQL Running Query with Execution Plan: Some times sql queries start performing poorly because of change in their execution plan. However no change is sql query are done. To investigate, Is it really becuase of chenage execution plan or something else DBA should use V$session view again. GV$session view has SLQ ID and Plan Hash Value of query. Plan Hash Value shows the Plan ID of currently using plan of Sql query. DBA can further look into plan and check either it's a good plan or bad one.

SQL> select b.address,b.hash_value,b.child_number,b.plan_hash_value,b.sql_text from v$session a, v$sql b where a.SQL_ADDRESS=b.ADDRESS and a.sid=16;

Suppose you want to know query executed by Session Id 16. This query will give you current query executed by session 16. To find it's execution plan use.

SELECT id, parent_id, LPAD (' ', LEVEL - 1) || operation || ' ' ||
options operation, object_name
FROM (
SELECT id, parent_id, operation, options, object_name
FROM v$sql_plan
WHERE address = '&address'
AND hash_value = &hash_value
AND child_number = &child_number
)
 START WITH id = 0
* CONNECT BY PRIOR id = parent_id;

Provide Address, Hash Value and Child number as input from the last query and you will get the execution plan of running query. Here you can see execution plan of currently running query.


5. Kill SQL Session OS Process: Sometimes I have seen if you kill a sql process using below command, Session still not disappears or take a very long time to kill.

SQL> alter system kill session '130,8764';
alter system kill session '130,8764'
*
ERROR at line 1:
ORA-00031: session marked for kill

In that case you can kill that process directly from OS Level. Below is the query to find OS process ID. I am killing a session with SID 16

SQL> select spid from v$process p, v$session s where paddr = addr and sid=16;
SPID
------------------------
18801

SQL> host kill -9 18801

SQL> select spid from v$process p, v$session s where paddr = addr and sid=16;
no rows selected

Session disappears from query immediately. I will suggest not to use this command until very critical, Before executing make sure you are not killing any background process like smon and pmon. If you will do that your instance will terminate immediately.
 
It is a huge list of usage of V$session view, I have listed few of them here. Please share in comments if you know more.
5 (3)
Article Rating (3 Votes)
Rate this article
Attachments
There are no attachments for this article.
Comments
There are no comments for this article. Be the first to post a comment.
Full Name
Email Address
Security Code Security Code
Related Articles RSS Feed
Script to reset NIM state and deallocate resources
Viewed 2115 times since Thu, Feb 21, 2019
CentOS / RHEL : Configure yum automatic updates with yum-cron service
Viewed 3280 times since Fri, Oct 26, 2018
SNAP
Viewed 1621 times since Mon, Sep 17, 2018
AIX WIKIS developerworks
Viewed 2109 times since Sun, Jun 17, 2018
ZFS: Verify/change properties of a zfs filesystem
Viewed 2266 times since Sun, Jun 3, 2018
Create bootable DVD iso image from a mksysb backup
Viewed 4008 times since Tue, Jul 17, 2018
Mirroring session (TTY) on AIX using portmir
Viewed 8961 times since Thu, Feb 21, 2019
Open SSL HowTo: Decode SSL Certificate
Viewed 5809 times since Mon, Feb 18, 2019
CentOS / RHEL : How to move a Volume Group from one system to another
Viewed 2988 times since Mon, Jan 28, 2019
AIX -- extending Logical Volumes online
Viewed 2486 times since Tue, Mar 12, 2019