v$sql和v$sqlarea区别

v$sql和v$sqlarea

官方文档解释:
V$SQL lists statistics on shared SQL areas without the GROUP BY clause and contains one row for each child of the original SQL text entered. Statistics displayed in V$SQL are normally updated at the end of query execution. However, for long running queries, they are updated every 5 seconds. This makes it easy to see the impact of long running SQL statements while they are still in progress.
V$SQLAREA displays statistics on shared SQL areas and contains one row per SQL string. It provides statistics on SQL statements that are in memory, parsed, and ready for execution.

环境准备:
sql_id,executions,first_load_time,last_load_time,disk_reads,buffer_gets,hash_value,plan_hash_value from v$sql where sql_text like ‘%zhuo%‘;
select sql_text,sql_id,version_count,executions,first_load_time,last_load_time,disk_reads,buffer_gets,hash_value,plan_hash_value from v$sqlarea where sql_text like ‘%zhuo%‘;

OWNER TABLE_NAME



ZHUO ZHUO
TEST ZHUO

SQL> select count(*) from zhuo.zhuo;

COUNT(*)

 18333

SQL> select count(*) from test.zhuo;

COUNT(*)

    42

两个用户下面有名字相同的一张表,但是表结构和内容都是不一样的。
为了避免查询到的数据影响,观察具体字段含义,把共享池和buffer cache清空:
SQL> alter system flush shared_pool;
SQL> alter system flush BUFFER_CACHE;
结果如下:

下面执行一次sql,观察哪些指标会发生变化:


hash_value:其实和sql_id是一个含义,都是唯一标识一条sql,两者可以相互转换
first_load_time:第一次载入shared pool的时间
last_load_time:最后一次载入shared pool的时间,也就是最后一次执行这条sql的时间
再次清空buffer cache,观察逻辑读和物理读的变化
SQL> alter system flush BUFFER_CACHE;

System altered.
SQL> set autot trace
SQL> select count(*) from zhuo;

Execution Plan
Plan hash value: 1214160148



| Id | Operation | Name | Rows | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 1 | 71 (0)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | | |
| 2 | TABLE ACCESS FULL| ZHUO | 18333 | 71 (0)| 00:00:01 |

Statistics
25 recursive calls
0 db block gets
269 consistent gets
244 physical reads
0 redo size
528 bytes sent via SQLNet to client
523 bytes received via SQL
Net from client
2 SQL*Net roundtrips to/from client
4 sorts (memory)
0 sorts (disk)
1 rows processed

和上面的结果一致,sql真正执行耗费的物理读和逻辑读和v$sql里面记录的数一致。
在执行一次:
SQL> select count(*) from zhuo;

Execution Plan
Plan hash value: 1214160148



| Id | Operation | Name | Rows | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 1 | 71 (0)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | | |
| 2 | TABLE ACCESS FULL| ZHUO | 18333 | 71 (0)| 00:00:01 |

Statistics
0 recursive calls
0 db block gets
246 consistent gets
0 physical reads
0 redo size
528 bytes sent via SQLNet to client
523 bytes received via SQL
Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed

从执行计划可知:所有的数据都已缓存到内存中,所以物理读为0,全部为逻辑读。再看v$sql里面记录的,应该是和上次执行完成的差值,才是一次sql执行耗费的物理读和逻辑读。
物理读:244-244=0
逻辑读:515-269=246
这就和执行计划的资源消耗相同了。

executions:执行次数,这个sql现在就执行了2次。里面记录的值也是2.

下面看v$sqlarea的区别:
用test用户执行一次查询:
SQL> conn test/test;
Connected.

SQL> select count(*) from zhuo;

COUNT(*)
42

查看v$sql和v$sqlarea



v$sql里面显示一条记录。v$sqlarea显示有关这个sql的两条记录。
v$sql里面的executions,一个是2次,一个是2次。v$sqlarea里面累加了,executions是3.
v$sql里面记录的,test用户的disk read为4,buffer get为24.
v$sqlare里面却是累加的:244+4=248,515+24=539.
v$sqlarea里面的version count为2,sql版本数。
*通过前文可以知道,文本相同的SQL语句,在数据库中的意义可能完全不同。比如数据库中存在两个用户zhuo和test,两个用户各拥有一张数据表zhuo。
那么当两个用户发出一个查询select count(
) from zhuo时,这个查询访问的对象,返回的结果可能完全不同,zhuo的查询访问的是zhuo.zhuo表,而DBTAN用户访问的则是test.zhuo表。但是单从SQL_TEXT上来说,这两个SQL没有任何区别**
在这个视图中,Oracle将v$sql中的sql_text相同的2个子指针合并起来,执行次数等信息也都进行了累计,version_count也显示为2,这就是v$sqlarea的聚合作用。

原文地址:https://blog.51cto.com/zhuozhuo/2487097

时间: 2024-08-29 07:20:15

v$sql和v$sqlarea区别的相关文章

v$sqlarea,v$sql,v$sqltext这三个视图提供的sql语句有什么区别?

v$sqltext存储的是完整的SQL,SQL被分割 SQL> desc v$sqltextName                                      Null?    Type----------------------------------------- -------- ----------------------------ADDRESS                                            RAW(4)    ---------

oracle 入门笔记--v$sql和v$sqlarea视图(转载)

转载于作者:dbtan 原文链接:http://www.dbtan.com/2009/12/vsql-and-vsqlarea-view.html v$sql和v$sqlarea视图: 上文提到,v$sqlarea和v$sql两个视图的不同之处在于,v$sql中为每一条SQL保留一个条目,而v$sqlarea中根据sql_text进行group by,通过version_count计算子指针的个数.下面对这个问题进行一点延伸探讨. 首先介绍一下v$sql视图,v$sql视图列举了共享SQL区(S

Oracle sql共享池$sqlarea分析SQL资源使用情况

遇到需要排查一个系统使用sql的情况,可以通过查询Oracle的$sql.$ssssion.$sqlarea进行统计排查 排查时可以先看一下$sql和$session的基本信息 select * from v$sql a, v$session b where b.SQL_ADDRESS = a.ADDRESS and b.SQL_HASH_VALUE = a.HASH_VALUE and b.SQL_CHILD_NUMBER = a.CHILD_NUMBER $sqlarea表列意思: 引用:h

v$sql、v$sqlarea、v$sqltext、v$sql_plan

转自:http://gldbhome.blog.51cto.com/1552935/886316 视图v$sqltext中没有SQL语句的相关统计信息,但是v$sqltext用多行来保存sql语句,而v$sqlarea中只能保存sql语句的前1000个字节,所以如果sql语句大于1000个字节,就要到v$sqltext中查看完整的语句,其字段PIECE表示每个sql的行顺序. v$sqlarea --------- 存储的SQL 和一些相关的信息,比如累计的执行次数,逻辑读,物理读等统计信息v$

Oracle、Mysql、Sql Server语句的区别

1.空值的处理——判断是否为空,为空时取一个值,不为空时取另一个值 1).Sql Server 中 ISNULL(check_expression,replacement_value) 解释:如果check_expression值为空,则返回replacement_value,否则直接返回check_expression的值 2).Mysql IFNULL(expr1.expr2) 解释:如果值expr1值为空,则返回expr2,否则直接返回expr1的值 3).Oracle NVL(expr1

mysql语句与sql语句的基本区别

1. MySQL支持enum和set类型,SQL Server不支持: 2. MySQL不支持nchar.nvarchar.ntext类型: 3. MySQL数据库的递增语句是AUTO_INCREMENT,而MS SQL是identity(1,1): 4. MS SQL默认到处表创建语句的默认值表示是((0)),而在MySQL里面是不允许带两括号的: 5. MySQL需要为表指定存储类型: 6. MS SQL识别符是[],[type]表示他区别于关键字,但是MySQL却是 `,也就是按键1左边的

以连接为例 说明Kettle和SQL处理数据的区别

首先声明本人不懂Java,只是从执行结果推测Kettle的处理机制,有不对的地方,还请多多指教. 据我推测:SQL对数据的处理是批量处理的,而Kettle对数据的处理是逐行处理的. 先理解一下meger(合并)和join(连接),假设A表两个字段,B表两个字段 meger: 结果为两个字段. join: 结果为4个字段. 下面从Kettle中的连接与合并,说明Kettle与SQL的区别.因为Kettle是逐行处理的,所以做连接前一定要根据关键字排好序. 1. Join Rows (cartesi

android java.util.Date和java.util.sql中Date的区别

1.将java.util.Date 转换为 java.sql.Date java.sql.Date sd; java.util.Date ud; //initialize the ud such as ud = new java.util.Date(); sd = new java.sql.Date(ud.getTime()); 2.若要插入到数据库并且相应的字段为Date类型 可使用PreparedStatement.setDate(int ,java.sql.Date)方法 其中的java.

SQL 和 NoSQL 的区别

一.概念 SQL (Structured Query Language) 数据库,指关系型数据库.主要代表:SQL Server,Oracle,MySQL(开源),PostgreSQL(开源). NoSQL(Not Only SQL)泛指非关系型数据库.主要代表:MongoDB,Redis,CouchDB. 二.区别 1.存储方式 SQL数据存在特定结构的表中:而NoSQL则更加灵活和可扩展,存储方式可以省是JSON文档.哈希表或者其他方式.SQL通常以数据库表形式存储数据.举个栗子,存个学生借