請慎重分析物件!

warehouse發表於2008-04-16
物件被分析之後,所有和該物件相關的被parse過的sql都會失效,下次需要執行相同的sql時需要再次parse,因此當系統執行過蒐集statistics的操作後面臨的可能是在短時間內產生很多hard parse。 其實非常容易理解,因為有了新的statistics,oracle在下次執行相同的sql時會使用新的statistics產生新的執行計劃。[@more@]

When you generate statistics for a table, column, or index, if the data dictionary already contains statistics for the object, then Oracle updates the existing statistics. Oracle also invalidates any currently parsed SQL statements that access the object.

session1:

SQL> alter system flush shared_pool;

系統已更改。

SQL> alter system flush buffer_cache;

系統已更改。

SQL> select * from tt;

ID NAME AGE
---------- ----------------------------------- ----------
3 b 0
4 b 0
6 b 0
0 a 0

SQL> select namespace,reloads,invalidations from v$librarycache;

NAMESPACE RELOADS INVALIDATIONS
--------------- ---------- -------------
SQL AREA 240 1326
TABLE/PROCEDURE 958 0
BODY 6 0
TRIGGER 0 0
INDEX 0 0
CLUSTER 0 0
OBJECT 0 0
PIPE 0 0
JAVA SOURCE 0 0
JAVA RESOURCE 0 0
JAVA DATA 0 0

已選擇11行。

SQL> select a.*,b.name
2 from v$sesstat a , v$statname b
3 where a.statistic#=b.statistic#
4 and b.name like '%parse%'
5 and a.sid=(select sid from v$mystat where rownum=1);

SID STATISTIC# VALUE NAME
---------- ---------- ---------- -----------------------------------
137 430 146 parse time cpu
137 431 479 parse time elapsed
137 432 1623 parse count (total)
137 433 557 parse count (hard)
137 434 4 parse count (failures)

為了準確觀察parse的次數,減少在同一個session中analyze table tt compute statistics;所引起的干擾,另開一個session執行analyze table tt compute statistics:

session2:

SQL> analyze table tt compute statistics;

表已分析。

再回到session1:

SQL> select * from tt;

ID NAME AGE
---------- ----------------------------------- ----------
3 b 0
4 b 0
6 b 0
0 a 0

SQL> select namespace,reloads,invalidations from v$librarycache;

NAMESPACE RELOADS INVALIDATIONS
--------------- ---------- -------------
SQL AREA 331 1328
TABLE/PROCEDURE 986 0
BODY 8 0
TRIGGER 0 0
INDEX 0 0
CLUSTER 0 0
OBJECT 0 0
PIPE 0 0
JAVA SOURCE 0 0
JAVA RESOURCE 0 0
JAVA DATA 0 0

已選擇11行。

SQL> select a.*,b.name
2 from v$sesstat a , v$statname b
3 where a.statistic#=b.statistic#
4 and b.name like '%parse%'
5 and a.sid=(select sid from v$mystat where rownum=1);

SID STATISTIC# VALUE NAME
---------- ---------- ---------- -----------------------------------
137 430 146 parse time cpu
137 431 479 parse time elapsed
137 432 1629 parse count (total)
137 433 558 parse count (hard)
137 434 4 parse count (failures)

SQL>

透過對比發現分析tt前後的INVALIDATIONS和parse count

都增加了,儘管執行了相同的sql:select * from tt;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/19602/viewspace-1002596/,如需轉載,請註明出處,否則將追究法律責任。

相關文章