Oracle 状态分析-sql语句

0、数据库参数属性

col PROPERTY_NAME format a25

col PROPERTY_VALUE format a30

col DESCRIPTION format a100

select * from database_properties;

select * from v$version;

1、求当前会话的SID,SERIAL#

SELECT Sid, Serial# FROM V$session

WHERE Audsid = Sys_Context('USERENV', 'SESSIONID');

2、查询session的OS进程ID

SELECT p.Spid "OS Thread", b.NAME "Name-User", s.Program, s.Sid, s.Serial#,s.Osuser, s.Machine

FROM V$process p, V$session s, V$bgprocess b

WHERE p.Addr = s.Paddr

AND p.Addr = b.Paddr And (s.sid=&1 or p.spid=&1)

UNION ALL

SELECT p.Spid "OS Thread", s.Username "Name-User", s.Program, s.Sid,s.Serial#, s.Osuser, s.Machine

FROM V$process p, V$session s

WHERE p.Addr = s.Paddr

And (s.sid=&1 or p.spid=&1)

AND s.Username IS NOT NULL;

3、根据sid查看对应连接正在运行的sql

SELECT /*+ PUSH_SUBQ */ Command_Type, Sql_Text, Sharable_Mem, Persistent_Mem, Runtime_Mem, Sorts,

Version_Count, Loaded_Versions, Open_Versions, Users_Opening, Executions,

Users_Executing, Loads, First_Load_Time, Invalidations, Parse_Calls,

Disk_Reads, Buffer_Gets, Rows_Processed, SYSDATE Start_Time,

SYSDATE Finish_Time, '>' || Address Sql_Address, 'N' Status

FROM V$sqlarea WHERE Address = (SELECT Sql_Address

FROM V$session WHERE Sid = &sid );

4、查找object为哪些进程所用

SELECT p.Spid, s.Sid, s.Serial# Serial_Num, s.Username User_Name,

a.TYPE Object_Type, s.Osuser Os_User_Name, a.Owner,

a.OBJECT Object_Name,

Decode(Sign(48 - Command), 1, To_Char(Command), 'Action Code #' || To_Char(Command)) Action,

p.Program Oracle_Process, s.Terminal Terminal, s.Program Program,

s.Status Session_Status

FROM V$session s, V$access a, V$process p

WHERE s.Paddr = p.Addr

AND s.TYPE = 'USER'

AND a.Sid = s.Sid

AND a.OBJECT = '&obj'

ORDER BY s.Username, s.Osuser

5、查看有哪些用户连接

SELECT s.Osuser Os_User_Name,Decode(Sign(48 - Command),1,To_Char(Command),

'Action Code #' || To_Char(Command)) Action,

p.Program Oracle_Process, Status Session_Status, s.Terminal Terminal,

s.Program Program, s.Username User_Name,

s.Fixed_Table_Sequence Activity_Meter, '' Query, 0 Memory,

0 Max_Memory, 0 Cpu_Usage, s.Sid, s.Serial# Serial_Num

FROM V$session s, V$process p

WHERE s.Paddr = p.Addr

AND s.TYPE = 'USER'

ORDER BY s.Username, s.Osuser

6、根据v.sid查看对应连接的资源占用等情况

SELECT n.NAME, v.VALUE, n.CLASS, n.Statistic# FROM V$statname n, V$sesstat v

WHERE v.Sid = &sid

AND v.Statistic# = n.Statistic#

ORDER BY n.CLASS, n.Statistic#

7、查询耗资源的进程(top session)

SELECT s.Schemaname Schema_Name,Decode(Sign(48 - Command),

1, To_Char(Command), 'Action Code #' || To_Char(Command)) Action,Status Session_Status, s.Osuser Os_User_Name, s.Sid, p.Spid,s.Serial# Serial_Num, Nvl(s.Username, '[Oracle process]') User_Name,

s.Terminal Terminal, s.Program Program, St.VALUE Criteria_Value

FROM V$sesstat St, V$session s, V$process p

WHERE St.Sid = s.Sid

AND St.Statistic# = To_Number('38')

AND ('ALL' = 'ALL' OR s.Status = 'ALL')

AND p.Addr = s.Paddr

ORDER BY St.VALUE DESC, p.Spid ASC, s.Username ASC, s.Osuser ASC

8、查看锁(lock)情况

SELECT /*+ RULE */ Ls.Osuser Os_User_Name, Ls.Username User_Name,Decode(Ls.TYPE,

'RW', 'Row wait enqueue lock', 'TM', 'DML enqueue lock','TX', 'Transaction enqueue lock', 'UL', 'User supplied lock') Lock_Type,o.Object_Name OBJECT,Decode(Ls.Lmode,1, NULL, 2, 'Row Share', 3, 'Row Exclusive',

4, 'Share', 5, 'Share Row Exclusive', 6, 'Exclusive',NULL) Lock_Mode,o.Owner, Ls.Sid, Ls.Serial# Serial_Num, Ls.Id1, Ls.Id2 FROM Sys.Dba_Objects o,

(SELECT s.Osuser, s.Username, l.TYPE, l.Lmode, s.Sid, s.Serial#, l.Id1,l.Id2 FROM V$session s, V$lock l

WHERE s.Sid = l.Sid) Ls

WHERE o.Object_Id = Ls.Id1

AND o.Owner <> 'SYS'

ORDER BY o.Owner, o.Object_Name;

9、查看等待(wait)情况

SELECT Ws.CLASS, Ws.COUNT COUNT, SUM(Ss.VALUE) Sum_Value

FROM V$waitstat Ws, V$sysstat Ss

WHERE Ss.NAME IN ('db block gets', 'consistent gets')

GROUP BY Ws.CLASS, Ws.COUNT;

10、求process/session的状态

SELECT p.Pid, p.Spid, s.Program, s.Sid, s.Serial#

FROM V$process p, V$session s

WHERE s.Paddr = p.Addr;

11、求谁阻塞了某个session(10g)

SELECT Sid, Username, Event, Blocking_Session, Seconds_In_Wait, Wait_Time

FROM V$session

WHERE State IN ('WAITING')

AND Wait_Class != 'Idle';

12、查会话的阻塞

col user_name format a32

SELECT /*+ rule */ Lpad(' ', Decode(l.Xidusn, 0, 3, 0)) || l.Oracle_Username User_Name,

o.Owner, o.Object_Name, s.Sid, s.Serial#

FROM V$locked_Object l, Dba_Objects o, V$session s

WHERE l.Object_Id = o.Object_Id

AND l.Session_Id = s.Sid

ORDER BY o.Object_Id, Xidusn DESC;

col username format a15

col lock_level format a8

col owner format a18

col object_name format a32

SELECT /*+ rule */ s.Username,Decode(l.TYPE, 'tm', 'table lock', 'tx', 'row lock', NULL) Lock_Level,

o.Owner, o.Object_Name, s.Sid, s.Serial#

FROM V$session s, V$lock l, Dba_Objects o

WHERE l.Sid = s.Sid

AND l.Id1 = o.Object_Id(+)

AND s.Username IS NOT NULL;

13、求等待的事件及会话信息/求会话的等待及会话信息

SELECT Se.Sid, s.Username, Se.Event, Se.Total_Waits, Se.Time_Waited,Se.Average_Wait

FROM V$session s, V$session_Event Se

WHERE s.Username IS NOT NULL

AND Se.Sid = s.Sid

AND s.Status = 'ACTIVE'

AND Se.Event NOT LIKE '%SQL*Net%'

ORDER BY s.Username;

SELECT s.Sid, s.Username, Sw.Event, Sw.Wait_Time, Sw.State,Sw.Seconds_In_Wait

FROM V$session s, V$session_Wait Sw

WHERE s.Username IS NOT NULL

AND Sw.Sid = s.Sid

AND Sw.Event NOT LIKE '%SQL*Net%'

ORDER BY s.Username;

14、求会话等待的file_id/block_id

col event format a24

col p1text format a12

col p2text format a12

col p3text format a12

SELECT Sid, Event, P1text, P1, P2text, P2, P3text, P3

FROM V$session_Wait

WHERE Event NOT LIKE '%SQL%'

AND Event NOT LIKE '%rdbms%'

AND Event NOT LIKE '%mon%'

ORDER BY Event;

SELECT NAME, Wait_Time

FROM V$latch l

WHERE EXISTS (SELECT 1

FROM (SELECT Sid, Event, P1text, P1, P2text, P2, P3text, P3

FROM V$session_Wait

WHERE Event NOT LIKE '%SQL%'

AND Event NOT LIKE '%rdbms%'

AND Event NOT LIKE '%mon%') x

WHERE x.P1 = l.Latch#);

15、求会话等待的对象

col owner format a18

col segment_name format a32

col segment_type format a32

SELECT Owner, Segment_Name, Segment_Type

FROM Dba_Extents

WHERE File_Id = &File_Id

AND &Block_Id BETWEEN Block_Id AND Block_Id + Blocks - 1;

16、求出某个进程,并对它进行跟踪

SELECT s.Sid, s.Serial#

FROM V$session s, V$process p

WHERE s.Paddr = p.Addr

AND p.Spid = &1;

Exec Dbms_System.Set_Sql_Trace_In_Session(&1, &2, TRUE);

Exec Dbms_System.Set_Sql_Trace_In_Session(&1, &2, FALSE);

17、求当前session的跟踪文件

SELECT P1.VALUE || '/' || P2.VALUE || '_ora_' || p.Spid || '.ora' Filename

FROM V$process p, V$session s, V$parameter P1, V$parameter P2

WHERE P1.NAME = 'user_dump_dest'

AND P2.NAME = 'instance_name'

AND p.Addr = s.Paddr

AND s.Audsid = Userenv('SESSIONID')

AND p.Background IS NULL

AND Instr(p.Program, 'CJQ') = 0;

18、求出锁定的对象

SELECT Do.Object_Name, Session_Id, Process, Locked_Mode

FROM V$locked_Object Lo, Dba_Objects Do

WHERE Lo.Object_Id = Do.Object_Id;

19、DB_Cache建议

SELECT size_for_estimate, buffers_for_estimate, estd_physical_read_factor, estd_physical_reads

FROM V$DB_CACHE_ADVICE

WHERE name = 'DEFAULT'

AND block_size = (SELECT value FROM V$PARAMETER WHERE name = 'db_block_size')

AND advice_status = 'ON';

20、查看各项SGA相关参数:SGA,SGASTAT

select substr(name,1,10) name,substr(value,1,10) value

from v$parameter where name = 'log_buffer';

select * from v$sgastat ;

select * from v$sga;

show parameters area_size #查看 各项区域内存参数, 其中sort_area为排序参数用;

各项视图建议参数值:V$DB_CACHE_ADVICE、V$SHARED_POOL_ADVICE),关于PGA

也有相关视图V$PGA_TARGET_ADVICE 等。

21、内存使用锁定在物理内存:

AIX 5L(AIX 4.3.3 以上)

logon aix as root

cd /usr/samples/kernel

./vmtune (信息如下) v_pingshm已经是1

./vmtune -S 1

然后oracle用户修改initSID.ora 中 lock_sga = true

重新启动数据库

HP UNIX

Root身份登陆

Create the file "/etc/privgroup": vi /etc/privgroup

Add line "dba MLOCK" to file

As root, run the command "/etc/setprivgrp -f /etc/privgroup":

$/etc/setprivgrp -f /etc/privgroup

oracle用户修改initSID.ora中lock_sga=true

重新启动数据库

SOLARIS (solaris2.6以上)

8i版本以上数据库默认使用隐藏参数 use_ism = true ,自动锁定SGA于内存中,不用设置

lock_sga, 如果设置 lock_sga =true 使用非 root 用户启动数据库将返回错误。

WINDOWS (作用不大)

不能设置lock_sga=true,可以通过设置pre_page_sga=true,使得数据库启动的时候就把所有内

存页装载,这样可能起到一定的作用。

22、内存参数调整

数据缓冲区命中率

select value from v$sysstat where name ='physical reads';

select value from v$sysstat where name ='physical reads direct';

select value from v$sysstat where name ='physical reads direct (lob)';

select value from v$sysstat where name ='consistent gets';

select value from v$sysstat where name = 'db block gets';

这里命中率的计算应该是

令 x = physical reads direct + physical reads direct (lob)

命中率 =100 - ( physical reads - x) / (consistent gets + db block gets - x)*100

通常如果发现命中率低于90%,则应该调整应用可可以考虑是否增大数据缓冲区;

共享池的命中率

select sum(pinhits)/sum(pins)*100 "hit radio" from v$librarycache;

假如共享池的命中率低于95%,就要考虑调整应用(通常是没使用bind var )或者增加内存;

关于排序部分

select name,value from v$sysstat where name like '%sort%';

假如我们发现sorts (disk)/ (sorts (memory)+ sorts (disk))的比例过高,则通常意味着

sort_area_size 部分内存较小,可考虑调整相应的参数。

关于log_buffer

select name,value from v$sysstat

where name in('redo entries','redo buffer allocation retries');

假如 redo buffer allocation retries/ redo entries 的比例超过1%我们就可以考虑增大log_buffer

oracle v$sqlarea 分析SQL语句使用资源情况

2011年01月27日 星期四 下午 04:42

V$SQLAREA

  本视图持续跟踪所有shared pool中的共享cursor,在shared pool中的每一条SQL语句都对应一列。本视图在分析SQL语句资源使用方面非常重要。

V$SQLAREA中的信息列

HASH_VALUE:SQL语句的Hash值。

ADDRESS:SQL语句在SGA中的地址。

这两列被用于鉴别SQL语句,有时,两条不同的语句可能hash值相同。这时候,必须连同ADDRESS一同使用来确认SQL语句。

PARSING_USER_ID:为语句解析第一条CURSOR的用户

VERSION_COUNT:语句cursor的数量

KEPT_VERSIONS:

SHARABLE_MEMORY:cursor使用的共享内存总数

PERSISTENT_MEMORY:cursor使用的常驻内存总数

RUNTIME_MEMORY:cursor使用的运行时内存总数。

SQL_TEXT:SQL语句的文本(最大只能保存该语句的前1000个字符)。

MODULE,ACTION:使用了DBMS_APPLICATION_INFO时session解析第一条cursor时的信息

V$SQLAREA中的其它常用列

SORTS: 语句的排序数

CPU_TIME: 语句被解析和执行的CPU时间

ELAPSED_TIME: 语句被解析和执行的共用时间

PARSE_CALLS: 语句的解析调用(软、硬)次数

EXECUTIONS: 语句的执行次数

INVALIDATIONS: 语句的cursor失效次数

LOADS: 语句载入(载出)数量

ROWS_PROCESSED: 语句返回的列总数

V$SQLAREA中的连接列Column View Joined Column(s)

HASH_VALUE, ADDRESS V$SESSION SQL_HASH_VALUE, SQL_ADDRESS

HASH_VALUE, ADDRESS V$SQLTEXT, V$SQL, V$OPEN_CURSOR HASH_VALUE, ADDRESS

SQL_TEXT V$DB_OBJECT_CACHE NAME

示例:

1.查看消耗资源最多的SQL:

Sql代码

SELECT hash_value, executions, buffer_gets, disk_reads, parse_calls FROM V$SQLAREA WHERE buffer_gets > 10000000 OR disk_reads > 1000000 ORDERBY buffer_gets + 100 * disk_reads DESC;

SELECT hash_value, executions, buffer_gets, disk_reads, parse_calls FROM V$SQLAREAWHERE buffer_gets > 10000000 OR disk_reads > 1000000 ORDER BY buffer_gets + 100 * disk_reads DESC;

2.查看某条SQL语句的资源消耗:

Sql代码

SELECT hash_value, buffer_gets, disk_reads, executions, parse_calls FROM V$SQLAREA WHERE hash_Value = 228801498 AND address = hextoraw('CBD8E4B0');

SELECT hash_value, buffer_gets, disk_reads, executions, parse_calls FROM V$SQLAREA WHERE hash_Value = 228801498 AND address = hextoraw('CBD8E4B0');

查找前10条性能差的sql语句

Sql代码

SELECT * FROM (select PARSING_USER_ID,EXECUTIONS,SORTS,COMMAND_TYPE,DISK_READS,sql_text FROM v$sqlarea orderBY disk_reads DESC )where ROWNUM<10 ;

SELECT * FROM (select PARSING_USER_ID,EXECUTIONS,SORTS,COMMAND_TYPE,DISK_READS,sql_text FROM v$sqlarea order BY disk_reads DESC )where ROWNUM<10 ;说明:

EXECUTIONS表示同一条SQL语句一共执行了多少次,SORTS表示排序的次数,DISK_READS表示物理读的数量。

DISK_READS NUMBER

The sum of the number of disk reads over all child cursors

SORTS NUMBER

Sum of the number of sorts that were done for all the child cursors

EXECUTIONS NUMBER

Total number of executions, totalled over all the child cursors

分析性能差的sql

Sql代码

SELECT EXECUTIONS , DISK_READS, BUFFER_GETS, ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio, ROUND(DISK_READS/EXECUTIONS,2) Reads_per_run, SQL_TEXT FROM V$SQLAREA WHERE EXECUTIONS>0 AND BUFFER_GETS >0 AND (BUFFER_GETS-DISK_READS)/BUFFER_GETS < 0.8

SELECT EXECUTIONS , DISK_READS, BUFFER_GETS, ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio, ROUND(DISK_READS/EXECUTIONS,2) Reads_per_run,SQL_TEXTFROM V$SQLAREA WHERE EXECUTIONS>0AND BUFFER_GETS >0 AND (BUFFER_GETS-DISK_READS)/BUFFER_GETS < 0.8查询共享池中已经解析过的SQL语句及其相关信息

--EXECUTIONS 所有子游标的执行这条语句次数

--DISK_READS 所有子游标运行这条语句导致的读磁盘次数

--BUFFER_GETS 所有子游标运行这条语句导致的读内存次数

--Hit_radio 命中率

--Reads_per_run 每次执行读写磁盘数

笼统的说EXECUTIONS,BUFFER_GETS,Hit_radio越高表示读内存多,磁盘少是比较理想的状态,因此越高越好

另外两个越高读磁盘次数越多,因此低点好

选出最占用资源的查询