Oracle 同一sql語句在測試和開發環境不同的執行計劃

kakaxi9521發表於2016-11-30

昨天下班前收到開發的郵件,一個執行sql語句執行的很慢,看了執行計劃,為未走索引。
收到郵件後,登入到開發環境devdb,執行語句,果真很慢。登入到測試環境uatdb,執行同樣的語句,速度很快。
開發和測試的為同一份生產資料匯入過來的(都是我做的資料同步),檢視了下兩邊的執行計劃,測試的走了索引,開發的未走。此時比較納悶,為什麼一樣的語句會走不同的執行計劃。
1. 檢視兩邊的索引情況,兩邊的的索引都一樣。
select * from dba_indexes where table_name='tabname'

2. 檢視兩邊的統計資訊情況,發現開發環境的統計資訊有過更新,測試環境沒有。 找到了不一樣的地方~~
select table_name,num_rows,a.blocks,a.last_analyzed from dba_tables a where a.table_name='tabname';

3. 在開發環境想辦法匯入以前的統計資訊,但是經過查詢沒有歷史統計資訊,此路不通。

4. 經過嘗試,最後刪除了開發環境的統計資訊,發現開始走索引了,執行速度變快。
SQL>dbms_stats.delete_table_stats(ownname => 'xxxxx',tabname => 'tabname') ;

5. 在網上找到了一篇比較好的文章。
http://blog.itpub.net/26892340/viewspace-721935/

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

相關文章