zhuzhufxz 2019-05-20
oracle数据库关于SQL查询相关的几个视图有v$sql,v$sqlarea,v$sqltext,那这中间有什么区别呢?
1)都存储了sql内容
2) 记录的都是位于内存中的sql内容
3) 因为是内存,所以都不保留历史记录
1、存储的位置不同
其中v$sql和v$sqlarea存储的sql都是位于shared sql area中的sql,而v$sqltext是位于sga中的sql。但文档没有明确说明这里的sga是否还包含了psa(私有sql区域--共享服务器模式下)。
2、存储sql的方式不同
v$sql和v$sqlarea都是用一行来存储sql全文,而v$sqltext用一行存储sql的一行。
3、v$sql不存储包含group by 的sql语句。
通常这个视图,在每个查询执行完成后更新,但对于执行很久的sql,它是每5秒更新一次,这点对于查看sql执行状态是有意义的。
4、存储的明细不同
V$SQL在子游标级别上列出了在共享sql区域的统计信息,他将原始sql文本展现为一行。V$SQL中的视图信息一般在sql执行的最后进行更新。然而,对于长时间执行的sql,每5秒会更新一次v$sql视图。这使得很容易查看长时间执行的sql在运行过程中带来的影响。
v$sql列说明,如没有特别说明,均指子游标,存储的是具体的SQL 和执行计划相关信息,实际上,v$sqlarea 可以看做 v$sql 根据 sqltext 等 做了 group by 之后的信息
通过以下语句查一下这些视图的定义,可以看出v$sql及v$sqlarea的源表比较接近 。
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$SQLAREA'; SELECT view_definition FROM v$fixed_view_definition WHERE view_name='GV$SQLTEXT';
1、 v$sql
SQL_TEXT //当前正在执行的游标的sql文本的前1000个字符 SQL_FULLTEXT //CLOB类型 整个sql文本,不用借助于V$SQL_TEXT视图来查看整个文本 SQL_ID //库缓存中的SQL父游标的标志 SHARABLE_MEM //子游标使用的共享内存的大小,bytes PERSISTENT_MEM //子游标生存时间中使用的固定内存的总量,bytes RUNTIME_MEM //在子游标执行过程中需要的固定内存大小,bytes SORTS //子游标发生的排序数量 LOADED_VERSIONS // 显示上下文堆是否载入,1是,0否 USERS_OPENING // 执行这个sql的用户数 FETCHES // sql取数据的次数 EXECUTIONS //自从被载入共享池后,sql执行的次数 FIRST_LOAD_TIME // 父游标产生的时间戳 PARSE_CALLS //解析调用的次数 DISK_CALLS //读磁盘的次数 DIRECT_WRITES //直接写的次数 BUFFER_GETS //直接从buffer中得到数据的次数 APPLICATION_WAIT_TIME // 应用等待时间,毫秒 CONCURRENCY_WAIT_TIME //并发等待时间,毫秒 USER_IO_WAIT_TIME //用户IO等待时间 ROWS_PROCESSED SQL //解析sql返回的总行数 OPTIMIZER_MODE //优化器模式 OPTIMIZER_COST //优化器对于sql给出的成本 PARSING_USER_ID //第一个创建这个子游标的用户id HASH_VALUES //解析产生的哈希值 CHILD_NUMBER //该子游标的数量 SERVICE //服务名 CPU_TIME //该子游标解析,执行和获取数据使用的CPU时间,毫秒 ELAPSED_TIME //sql的执行时间,毫秒 INVALIDATIONS //该子游标的无效次数 MODULE //第一次解析该语句时,通过DBMS_APPLICAITON_INFO.SET_ACTION设置的模块名 ACTION //第一次解析该语句时,通过DBMS_APPLICAITON_INFO.SET_ACTION设置的动作名 IS_OBSOLETE //标记该子游标过期与否,当子游标过大时会发生这种情况 is_bind_sensitive //不仅指出是否使用绑定变量窥测来生成执行计划,而且指出这个执行计划是否依赖于窥测到的值。如果是,这个字段会被设置为Y,否则会被设置为N。 is_bind_aware //表明游标是否使用了扩展的游标共享。如果是,这个字段会被设置为Y,如果不是,这个字段会被设置为N。如果是设置为N,这个游标将被废弃,不再可用。 is_shareable //表明游标能否被共享。如果可以,这个字段会被设置为Y,否则,会被设置为N。如果被设置为N,这个游标将被废弃,不再可用。
2、v$sqlarea
v$sqlarea的字段定义和v$sql基本一致,不同的是V$SQLAREA是在父游标级别上统计的sql信息,v$sql的汇总表,进行了group by hash_value,sql_id的汇总。
3、v$sqltext
本视图包括Shared pool中SQL语句的完整文本,一条SQL语句可能分成多个块被保存于多个记录内。注:V$SQLAREA和v$sql中的SQL_TEXT字段只包括头1000个字符, SQL_FULLTEXT以CLOB方式包含了所有的字符
实际调优中建议使用v$sql, 相对来说比v$sqlarea快,而且还不会产生share pool latch的争用。因v$sql及v$sqlarea存放着统计信息在调优时使用居多,但其sql是不全的,如果想获得完整的sql就要用v$sqltext了
后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注一下~