关于10g中v$librarycache GETHITRATIO的认识
很多人资料上说shared pool中sql语句的命中率是看v$librarycache中的GETHITRATIO列的值,但是在10g中这种情况发生了改变。
请看下列情况:
第一个session登陆,并查询当前gets和gethits的值。
SQL> conn / as sysdba
Connected.
SQL> select namespace,gets,gethits,gethitratio from v$librarycache where namespace='SQL AREA';
NAMESPACE
GETSGETHITS GETHITRATIO
--------------- ---------- ---------- -----------
SQL AREA
2037122.059891998
SQL>
发出SQL语句
SQL> select count(*) from me.t_person;
COUNT(*)
----------
100
SQL>
再次观察gets和gethits的值
SQL> select namespace,gets,gethits,gethitratio from v$librarycache where namespace='SQL AREA';
NAMESPACE
GETSGETHITS GETHITRATIO
--------------- ---------- ---------- -----------
SQL AREA
2038122 .05986261
SQL>
发现gets增加1,GETHITS无变化。表示刚才发出的SQL语句未命中,属于正常情况。
现在第2个session登陆,并执行相同的SQL语句
SQL> conn / as sysdba
Connected.
SQL> select count(*) from me.t_person;
COUNT(*)
----------
100
SQL>
回到第一个session中,再次查询gets和gethits的值。
SQL> select namespace,gets,gethits,gethitratio from v$librarycache where namespace='SQL AREA';
NAMESPACE
GETSGETHITS GETHITRATIO
--------------- ---------- ---------- -----------
SQL AREA
2038122 .05986261
SQL>
现在 GETS和GETHITS的值没有发生变化,
由此可见,如果SQL在library cache中命中,GETS和GETHITS并没有增加,如果SQL在library cache中未命中,则GETS递增1,GETHITS不变。
那么SQL在library cache中的命中率又如何计算?
注意我的GETHITRATIO的值,只有5%的命中率,看起来这是极不正常的。
但实际上是由于GETHITRATIO统计失效引发的。
|