前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >V$SQL、V$SQLAREA 和 V$SQLSTATS 的区别

V$SQL、V$SQLAREA 和 V$SQLSTATS 的区别

作者头像
用户8196625
发布2024-02-26 15:57:29
2450
发布2024-02-26 15:57:29
举报
文章被收录于专栏:oracleaceoracleace

Oracle 数据库提供了三个动态视图,用于查询当前共享池中的所有 SQL 语句的执行统计信息。它们分别是 V$SQL、V$SQLAREA 和 V$SQLSTATS。本文将探讨它们之间的区别。

V$SQL 对于每个不同版本的 SQL 语句都有一行记录。这意味着每个子语句都有自己的执行统计信息,而且一个 SQL 语句在该视图中可能有多行记录。

V$SQLAREA 和 V$SQLSTATS 对于每个不同的 SQL 字符串(即每个父游标)只有一行记录。这意味着所有子游标的统计信息,即该游标的不同版本,都被合并到一起。

以下示例说明了它们之间的区别。

首先,我们执行相同的 SQL 语句两次,同时在两次执行之间更改会话变量,以创建同一个SQL的两个执行版本:

代码语言:javascript
复制
SQL> select /* sql_version */ last_name from employees where EMPLOYEE_ID<10;
未选择行

SQL> alter session set optimizer_index_cost_adj=101;
会话已更改。

SQL> select /* sql_version */ last_name from employees where EMPLOYEE_ID<10;
未选择行
代码语言:javascript
复制

然后,我们查询 V$SQL、V$SQLAREA 和 V$SQLSTATS 中的 SQL 执行统计信息。

代码语言:javascript
复制
SQL> select sql_id, substr(sql_text,1,50), buffer_gets, ELAPSED_TIME, child_number, CHILD_ADDRESS from v$sql where sql_id='8qxn9jfkd7348';
SQL_ID          SUBSTR(SQL_TEXT,1,50)                                  BUFFER_GETS   ELAPSED_TIME   CHILD_NUMBER CHILD_ADDRESS
8qxn9jfkd7348   select /* sql_version */ last_name from employees                1           2571              0 0000000095FBF368
8qxn9jfkd7348   select /* sql_version */ last_name from employees                1           2679              1 0000000096560ED8

SQL> select sql_id, substr(sql_text,1,50), buffer_gets, ELAPSED_TIME from v$sqlarea where sql_id='8qxn9jfkd7348';
SQL_ID          SUBSTR(SQL_TEXT,1,50)                                  BUFFER_GETS   ELAPSED_TIME
8qxn9jfkd7348   select /* sql_version */ last_name from employees                2           5250

SQL> select sql_id, substr(sql_text,1,50), buffer_gets, ELAPSED_TIME from v$sqlstats where sql_id='8qxn9jfkd7348';
SQL_ID          SUBSTR(SQL_TEXT,1,50)                                  BUFFER_GETS   ELAPSED_TIME
8qxn9jfkd7348   select /* sql_version */ last_name from employees                2           5250

在这里,我们可以看到 V$SQL 包含两行 SQL 语句的记录,而 V$SQLAREA 和 V$SQLSTATS 只包含其中一行,并且执行统计信息列如 BUFFER_GETS 和 ELAPSED_TIME 已被汇总。

在Oracle 10g R2 推出 V$SQLSTATS 之前,V$SQLAREA 是我最喜欢的 SQL 调优视图之一。V$SQLSTATS 与 V$SQLAREA 有几点不同:

  • VSQLSTATS 包含 SQL 语句的完整文本,不再需要访问 VSQLAREA 和 V
  • Oracle声称V$SQLSTATS 更快且更具扩展性。
  • V$SQLSTATS 提供了更长的访问窗口,也就是说即使某些过期的SQL已经不在共享池中,仍然可能在这个视图中查询到。

在下一篇文章中,我将为读者提供一些现成的脚本用于查询V$SQLSTATS 找到需要优化的TOP SQL 。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-02-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 oracleace 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Oracle 数据库提供了三个动态视图,用于查询当前共享池中的所有 SQL 语句的执行统计信息。它们分别是 V$SQL、V$SQLAREA 和 V$SQLSTATS。本文将探讨它们之间的区别。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档