1、查一下这些视图的定义你就能理解,它们的源都是一个。
select view_definition from v$fixed_view_definition where view_name=’gv$sql’;
select view_definition from v$fixed_view_definition where view_name=’gv$sql_area’;
2、实际上最模糊的是v$sql与v$sqlarea,区别与联系除biti说的还有:
a、v$sql_area相当于是按inst_id, kglnaobj, kglhdpar, kglnahsh, kglnatim, globts0,globt19, kglobts1, kglobt20,decode(kglobt33, 1, ‘y’, ‘n’),kglhdclt这些列的自v$sql的group by,也就是说v$sql的每一行表示的是每一个sql语句的一个versiion,而v$sqlarea存放的是相同语句不同version一个汇总。
b、 v$sql与v$sqlarea的源都是一个:x$kglcursor
c、实际调优中建议使用v$sql,相对来说比v$sqlarea快,而且还不会产生share pool latch的争用。
3、因v$sql及v$sqlarea存放着统计信息在调优时使用居多,但其sql是不全的,如果想获得完整的sql就要用v$sqltext了。
————————————————————————————————————-
oracle v$sqlarea 分析sql语句使用资源情况
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代码
1.select hash_value, executions, buffer_gets, disk_reads, parse_calls
2.from v$sqlarea
3.where buffer_gets > 10000000 or disk_reads > 1000000
4.order by buffer_gets + 100 * disk_reads desc;
select hash_value, executions, buffer_gets, disk_reads, parse_calls
from v$sqlarea
where buffer_gets > 10000000 or disk_reads > 1000000
order by buffer_gets + 100 * disk_reads desc;
2.查看某条sql语句的资源消耗:
sql代码
1.select hash_value, buffer_gets, disk_reads, executions, parse_calls
2.from v$sqlarea
3.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代码
1.select * from (select parsing_user_id,executions,sorts,command_type,disk_reads,sql_text from v$sqlarea
2.order by 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代码
1.select executions , disk_reads, buffer_gets,
2.round((buffer_gets-disk_reads)/buffer_gets,2) hit_radio,
3.round(disk_reads/executions,2) reads_per_run,
4.sql_text
5.from v$sqlarea
6.where executions>0
7.and buffer_gets >0
8.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_text
from v$sqlarea
where executions>0
and 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越高表示读内存多,磁盘少是比较理想的状态,因此越高越好
另外两个越高读磁盘次数越多,因此低点好
选出最占用资源的查询
sql代码
1.select b.username username,a.disk_reads reads,a.executions exec,
2. a.disk_reads/decode(a.executions,0,1,a.executions) rds_exec_ratio,
3. a.sql_text statement
4. from v$sqlarea a,dba_users b
5. where a.parsing_user_id=b.user_id
6. and a.disk_reads>100000
———————————————————————————-
在本视图中,每一个连接到实例中的 session都拥有一条记录。包括用户 session及后台进程如 dbwr, lgwr, arcchiver等等。
v$session中的常用列
v$session是基础信息视图,用于找寻用户 sid或 saddr。不过,它也有一些列会动态的变化,可用于检查用户。如例:
sql_hash_value, sql_address:这两列用于鉴别默认被 session执行的 sql语句。如果为 null或 0,那就说明这个 session没有执行任何 sql语句。 prev_hash_value和 prev_address两列用来鉴别被 session执行的上一条语句。
注意:当使用 sql*plus进行选择时,确认你重定义的列宽不小于 11以便看到完整的数值。
status:这列用来判断 session状态是:
l achtive:正执行 sql语句 (waiting for/using a resource)
l inactive:等待操作 (即等待需要执行的 sql语句 )
l killed:被标注为删除
下列各列提供 session的信息,可被用于当一个或多个 combination未知时找到 session。
session信息
l sid: session标识,常用于连接其它列
l serial#:如果某个 sid又被其它的 session使用的话则此数值自增加 (当一个 session结束,另一个 session开始并使用了同一个 sid)。
l audsid:审查 session id唯一性,确认它通常也用于当寻找并行查询模式
l username:当前 session在 oracle中的用户名。
client信息
数据库 session被一个运行在数据库服务器上或从中间服务器甚至桌面通过 sql*net连接到数据库的客户端进程启动,下列各列提供这个客户端的信息
l osuser:客户端操作用户名
l machine:客户端执行的机器
l terminal:客户端运行的终端
l process:客户端进程的 id
l program:客户端执行的客户端程序
要显示用户所连接 pc的 terminal、 osuser,需在该 pc的 oracle.ini或 windows中设置关键字 terminal, username。
application信息
调用 dbms_application_info包以设置一些信息区分用户。这将显示下列各列。
l client_info: dbms_application_info中设置
l action: dbms_application_info中设置
l module: dbms_application_info中设置
下列 v$session列同样可能会被用到:
l row_wait_obj#
l row_wait_file#
l row_wait_block#
l row_wait_row#
v$session中的连接列
column view joined column(s)
sid v$session_wait,,v$sesstat,,v$lock,v$session_event,v$open_cursor sid
(sql_hash_value, sql_address) v$sqltext, v$sqlarea, v$sql (hash_value, address)
(prev_hash_value, prev_sql_address) v$sqltext, v$sqlarea, v$sql (hash_value, address)
taddr v$transaction addr
paddr v$process addr
示例:
1.查找你的 session信息
select sid, osuser, username, machine, process
from v$session where audsid = userenv( ‘sessionid’ );
2.当 machine已知的情况下查找 session
select sid, osuser, username, machine, terminal
from v$session
where terminal = ‘pts/tl’ and machine = ‘rgmdbs1’ ;
3.查找当前被某个指定 session正在运行的 sql语句。假设 sessionid为 100
select b.sql_text
from v$session a,v$sqlarea b
where a.sql_hashvalue=b. hash_value and a.sid= 1 00
或者
select b.sql_text
from v$session a,v$sqlarea b //v$sqlarea 只包括sql的1000个字符,v$sqltext is all
where a.sql_hash_value = b.hash_value and a.terminal = ‘backham’;//backham is my computer name
寻找被指定 session执行的 sql语句是一个公共需求,如果 session是瓶颈的主要原因,那根据其当前在执行的语句可以查看 session在做些什么。
v$sqltext
本视图包括 shared pool中 sql语句的完整文本,一条 sql语句可能分成多个块被保存于多个记录内。
注: v$sqlarea只包括头 1000个字符。
v$sqltext中的常用列
l hash_value: sql语句的 hash值
l address: sql语句在 sga中的地址
l sql_text: sql文本。
l piece: sql语句块的序号
v$sqltext中的连接列
column view joined column(s)
hash_value, address v$sql, v$session hash_value, address
hash_value. address v$session sql_hash_value, sql_address
示例:已知 hash_value:3111103299,查询 sql语句:
select * from v$sqltext
where hashvalue= ‘3111103299’
order by piece
v$sqlarea
本视图持续跟踪所有 shared pool中的共享 cursor,在 shared pool中的每一条 sql语句都对应一列。本视图在分析 sql语句资源使用方面非常重要。
v$sqlarea中的信息列
l hash_value: sql语句的 hash值。
l address: sql语句在 sga中的地址。
这两列被用于鉴别 sql语句,有时,两条不同的语句可能 hash值相同。这时候,必须连同 address一同使用来确认 sql语句。
l parsing_user_id:为语句解析第一条 cursor的用户
l version_count:语句 cursor的数量
l kept_versions:
l sharable_memory: cursor使用的共享内存总数
l persistent_memory: cursor使用的常驻内存总数
l runtime_memory: cursor使用的运行时内存总数。
l sql_text: sql语句的文本(最大只能保存该语句的前 1000个字符)。
l module,action:使用了 dbms_application_info时 session解析第一条 cursor时的信息
v$sqlarea中的其它常用列
l sorts: 语句的排序数
l cpu_time: 语句被解析和执行的 cpu时间
l elapsed_time: 语句被解析和执行的共用时间
l parse_calls: 语句的解析调用 (软、硬 )次数
l executions: 语句的执行次数
l invalidations: 语句的 cursor失效次数
l loads: 语句载入 (载出 )数量
l 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:
select hash_value, executions, buffer_gets, disk_reads, parse_calls
from v$sqlarea
where buffer_gets > 10000000 or disk_reads > 1000000
order by buffer_gets + 100 * disk_reads desc ;
2. 查看某条 sql 语句的资源消耗:
select hash_value, buffer_gets, disk_reads, executions, parse_calls
from v$sqlarea
where hash_value = 228801498 and address = hextoraw( ‘cbd8e4b0’ );
3.查找前10条性能差的sql语句
sql代码 select * from (select parsing_user_id,executions,sorts,command_type,disk_reads,sql_text from v$sqlarea 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表示物理读的数量。
(1) v$sql 一条语句可以映射多个 cursor,因为对象所指的 cursor可以有不同用户 (如例 1)。如果有多个 cursor(子游标 )存在,在 v$sqlarea为所有 cursor提供集合信息。
例 1:
这里介绍以下 child cursor
user a: select * from tbl
user b: select * from tbl
大家认为这两条语句是不是一样的啊,可能会有很多人会说是一样的,但我告诉你不一定,那为什么呢?
这个 tbla看起来是一样的,但是不一定哦,一个是 a用户的 , 一个是 b用户的,这时他们的执行计划分析代码差别可能就大了哦,改下写法大家就明白了 :
select * from a.tbl
select * from b.tbl
在个别 cursor上, v$sql可被使用。该视图包含 cursor级别资料。当试图定位 session或用户以分析 cursor时被使用。
plan_hash_value列存储的是数值表示的 cursor执行计划。可被用来对比执行计划。 plan_hash_value让你不必一行一行对比即可轻松鉴别两条执行计划是否相同。
v$sql中的列说明:
l sql_text: sql文本的前 1000个字符
l sharable_mem:占用的共享内存大小 (单位: byte)
l persistent_mem:生命期内的固定内存大小 (单位: byte)
l runtime_mem:执行期内的固定内存大小
l sorts:完成的排序数
l loaded_versions:显示上下文堆是否载入, 1是 0否
l open_versions:显示子游标是否被锁, 1是 0否
l users_opening:执行语句的用户数
l fetches: sql语句的 fetch数。
l executions:自它被载入缓存库后的执行次数
l users_executing:执行语句的用户数
l loads:对象被载入过的次数
l first_load_time:初次载入时间
l invalidations:无效的次数
l parse_calls:解析调用次数
l disk_reads:读磁盘次数
l buffer_gets:读缓存区次数
l rows_processed:解析 sql语句返回的总列数
l command_type:命令类型代号
l optimizer_mode: sql语句的优化器模型
l optimizer_cost:优化器给出的本次查询成本
l parsing_user_id:第一个解析的用户 id
l parsing_schema_id:第一个解析的计划 id
l kept_versions:指出是否当前子游标被使用 dbms_shared_pool包标记为常驻内存
l address:当前游标父句柄地址
l type_chk_heap:当前堆类型检查说明
l hash_value:缓存库中父语句的 hash值
l plan_hash_value:数值表示的执行计划。
l child_number:子游标数量
l module:在第一次解析这条语句是通过调用 dbms_application_info.set_module设置的模块名称。
l action:在第一次解析这条语句是通过调用 dbms_application_info.set_action设置的动作名称。
l serializable_aborts:事务未能序列化次数
l outline_category:如果 outline在解释 cursor期间被应用,那么本列将显示出 outline各类,否则本列为空
l cpu_time:解析 /执行 /取得等 cpu使用时间 (单位,毫秒 )
l elapsed_time:解析 /执行 /取得等消耗时间 (单位,毫秒 )
l outline_sid: outline session标识
l child_address:子游标地址
l sqltype:指出当前语句使用的 sql语言版本
l remote:指出是否游标是一个远程映象 (y/n)
l object_status:对象状态 (valid or invalid)
l is_obsolete:当子游标的数量太多的时候,指出游标是否被废弃 (y/n)
—————————————————————————————————————————
v$sqltext
存储的是完整的sql,sql被分割
sql> desc v$sqltext
name null? type
—————————————– ——– —————————-
address raw(4) ———
hash_value number ——— 和 address 一起唯一标志一条sql
command_type number
piece number ———- 分片之后的顺序编号
sql_text varchar2(64) ————– 注意长度
v$sqlarea ——— 存储的sql 和一些相关的信息,比如累计的执行次数,逻辑读,物理读等统计信息
sql> desc v$sqlarea
name null? type
—————————————– ——– —————————-
sql_text varchar2(1000)
sharable_mem number
persistent_mem number
runtime_mem number
sorts number
version_count number
loaded_versions number
open_versions number
users_opening number
fetches number
executions number
users_executing number
loads number
first_load_time varchar2(38)
invalidations number
parse_calls number
disk_reads number
buffer_gets number
rows_processed number
command_type number
optimizer_mode varchar2(25)
parsing_user_id number
parsing_schema_id number
kept_versions number
address raw(4)
hash_value number
module varchar2(64)
module_hash number
action varchar2(64)
action_hash number
serializable_aborts number
cpu_time number
elapsed_time number
is_obsolete varchar2(1)
child_latch number
v$sql ———- 存储的是具体的sql 和执行计划相关信息,实际上,v$sqlarea 可以看做 v$sql 根据 sqltext 等 做了 group by 之后的信息
sql> desc v$sql
name null? type
—————————————– ——– —————————-
sql_text varchar2(1000)
sharable_mem number
persistent_mem number
runtime_mem number
sorts number
loaded_versions number
open_versions number
users_opening number
fetches number
executions number
users_executing number
loads number
first_load_time varchar2(38)
invalidations number
parse_calls number
disk_reads number
buffer_gets number
rows_processed number
command_type number
optimizer_mode varchar2(10)
optimizer_cost number
parsing_user_id number
parsing_schema_id number
kept_versions number
address raw(4)
type_chk_heap raw(4)
hash_value number
plan_hash_value number
child_number number ———- 注意这个
module varchar2(64)
module_hash number
action varchar2(64)
action_hash number
serializable_aborts number
outline_category varchar2(64)
cpu_time number
elapsed_time number
outline_sid number ————– 注意这里跟 outline 有关
child_address raw(4)
sqltype number
remote varchar2(1)
object_status varchar2(19)
literal_hash_value number
last_load_time varchar2(38)
is_obsolete varchar2(1)
child_latch number
另外注意这个
ql> desc v$sql_plan
name null? type
—————————————– ——– —————————-
address raw(4)
hash_value number
child_number number ———— 注意这个和 v$sql 里面的相同字段
operation varchar2(60)
options varchar2(60)
object_node varchar2(20)
object# number
object_owner varchar2(30)
object_name varchar2(64)
optimizer varchar2(40)
id number
parent_id number
depth number
position number
search_columns number
cost number
cardinality number
bytes number
other_tag varchar2(70)
partition_start varchar2(10)
partition_stop varchar2(10)
partition_id number
other varchar2(4000)
distribution varchar2(40)
cpu_cost number
io_cost number
temp_space number
access_predicates varchar2(4000)
filter_predicates varchar2(4000)
实际上,看起来同样的一句sql ,往往具有不同的执行计划
如果是不同的数据库用户,那么相应的涉及的 对象 可能都不一样,注意v$sql 中
object# number
object_owner varchar2(30)
object_name varchar2(64)
optimizer varchar2(40)
即使是相同的数据库用户,若 session 的优化模式、session 级的参数 等不一样,执行计划也能不同。所以即使相同的sql,也可能具有不同的执行计划!
v$sql join to v$sql_plan 就代表了具体的sql的执行计划,通过下面3个字段做连接
address raw(4)
hash_value number
child_number number
而v$sqlarea 忽略了 执行计划 等差异,只是在形式上sql文本看起来一样!相当于做了个聚合,是多个不同执行计划的sql的聚合和累计信息