V$SQL in Oracle10g

May 25th, 2007 | Categories: Boring | Tags:

文档上提到,从10gR2开始,Oracle将每5秒左右对运行时间比较长的SQL,更新这些SQL的统计信息,如buffer gets,disk reads等,便于监控SQL的运行状态。这样每次的statspack就更够比较精确的统计出高成本的SQL。


V$SQL lists statistics on shared SQL area 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.


如下在statistics_level=typeical下测试,

Session 执行一个迪卡尔乘积,需要很多时间完成的SQL.

  1. SQL> select count(*) from big,big;

观察这个SQL的统计信息是否及时更新,

  1. SQLselect sql_text,CPU_TIME,BUFFER_GETS,DISK_READS,sysdate  from v$sql 
  2. where sql_text='select count(*) from big,big';
  3.  
  4. SQL_TEXT                         CPU_TIME BUFFER_GETS DISK_READS SYSDATE
  5. ----------------------------------------- ----------- ---------- -------------------
  6. select count(*) from big,big    138886474     2589064    2585070 2007-05-25 10:02:57
  7.  
  8. SQL> /
  9. SQL_TEXT                         CPU_TIME BUFFER_GETS DISK_READS SYSDATE
  10. ----------------------------------------- ----------- ---------- -------------------
  11. select count(*) from big,big    150663672     2798411    2794091 2007-05-25 10:03:09
  12.  
  13. SQL> /
  14. SQL_TEXT                         CPU_TIME BUFFER_GETS DISK_READS SYSDATE
  15. ----------------------------------------- ----------- ---------- -------------------
  16. select count(*) from big,big    521347231     9531699    9516942 2007-05-25 10:09:26
  17.  
  18. SQL> /
  19. SQL_TEXT                         CPU_TIME BUFFER_GETS DISK_READS SYSDATE
  20. ----------------------------------------- ----------- ---------- -------------------
  21. select count(*) from big,big    527235870     9641775    9626846 2007-05-25 10:09:35

可以看到对于运行长时间的SQL能够及时更新统计信息。



然后在statistics_level=basic下测试,

  1. SQL> alter system set  statistics_level=basic;
  2. System altered.

同样执行迪卡尔乘积,观察v$sql统计信息

  1. SQL> /
  2. SQL_TEXT                        CPU_TIME BUFFER_GETS DISK_READS SYSDATE
  3. ---------------------------------------- ----------- ---------- -------------------
  4. select count(*) from big,big        6969          17          0 2007-05-25 10:14:14
  5.  
  6. SQL> /
  7. SQL_TEXT                        CPU_TIME BUFFER_GETS DISK_READS SYSDATE
  8. ---------------------------------------- ----------- ---------- -------------------
  9. select count(*) from big,big        6969          17          0 2007-05-25 10:15:00
  10.  
  11. SQL> /
  12. SQL_TEXT                        CPU_TIME BUFFER_GETS DISK_READS SYSDATE
  13. ---------------------------------------- ----------- ---------- -------------------
  14. select count(*) from big,big        6969          17          0 2007-05-25 10:15:45

V$SQL只显示了17个buffer gets,就停止了更新

估计statistics_level中的某个控制选项决定了更新V$SQL的频率;对于特别繁忙的数据库,可以设置statistics_level=basic,来避免Oracle统计各种信息(*_memory_adviser,sql_tune_adviser etc)导致的资源消耗

Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪 ViVi 365Key 网摘 天极网摘 和讯网摘 博拉网 POCO 网摘 饭否 QQ 书签 Digbuzz 我挖网 Mister Wong
No comments yet.