一模一樣的SQL重新解析即重新生成執行計劃的方法

lusklusklusk發表於2017-04-17
1.對SQL中的物件analyze收集統計資訊
SQL> analyze table TEST_OWNER.TEST_TABLE compute statistics;

2.對SQL中的物件gather_table_stats加no_invalidate=>FALSE收集統計資訊
SQL> exec dbms_stats.gather_table_stats('TEST_OWNER','TEST_TABLE',no_invalidate=>FALSE);

3.SQL長時間沒有執行,被刷出SHARED POOL或直接重新整理共享池,再次執行時需要重新解析。
SQL> alter system flush shared_pool;

4.在SQL引用的物件上執行了DDL操作,甚至是結構發生了變化,比如新增一個索引或comment
SQL> comment on column TEST_TABLE.TEST_COLUMN is 'column is test for sqlplan';

5.對SQL引用的物件進行了許可權更改
SQL> grant all on TEST_OWNER.TEST_TABLE to TEST_OWNER2

6.還可以單獨清除這個sql在共享池中的資訊
Exec DBMS_SHARED_POOL.PURGE('v$sql.ADDRESS,v$sql.HASH_VALUE','c')
雖說10G開始sql_id等同於address+hash value的作用,但此處不能使用sql_id



TEST_OWNER使用者執行select * from TEST_TABLE已經N次了
以上6項任意一項執行後,TEST_OWNER使用者再次執行select * from TEST_TABLE都會重新解析,即下面語句中的EXECUTIONS為1,不再是N+1
select sql_id,first_load_time,last_load_time,last_active_time,EXECUTIONS,child_number,sql_text from v$sql where PARSING_SCHEMA_NAME='TEST_OWNER' and sql_text like 'select * from TEST_TABLE'



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

相關文章