2010-04-21 50 views
2

我正在比較查詢我的開發和生產數據庫。Oracle:數據庫之間執行計劃的差異

它們都是Oracle 9i,但幾乎每個查詢都有完全不同的執行計劃,具體取決於數據庫。

所有表/索引是相同的,但開發數據庫中有大約1/10日爲每個表中的行。

在生產中,精選最查詢的查詢執行計劃是從開發不同,且成本somtimes 1000倍以上。生產查詢在某些情況下似乎還沒有使用正確的查詢索引(全表訪問)。

我在希望的CBO會想辦法的跑了兩個數據庫dbms_utility.analyze模式最近爲好。

是否有一些其他可能導致此問題的基礎Oracle配置?

我是一個開發商大多所以這類DBA分析的是在第一次相當混亂..

+0

您是否更新統計數據? UPDATE STATISTICS schema.table WITH FULLSCAN; – mevdiven 2010-04-21 17:07:03

+1

@mevdiven - 對不起,這不是Oracle語法。 @威爾 - 你想了解和使用Oracle DBMS_STATS包。 – dpbradley 2010-04-21 17:27:19

+0

你說得對。這不是Oracle。 Oracle的是ANALYZE TABLE。感謝您的糾正。 – mevdiven 2010-04-21 18:34:43

回答

4

1)我會檢查的第一件事是,如果數據庫參數跨越PROD和DEV等同。如果其中一個影響基於成本的優化器決策的參數不同,則所有投注都將關閉。您可以在v $ parameter視圖中看到參數;

2)有最新的對象統計信息是偉大的,但要記住你所指出的巨大差異 - 開發有刺的行的10%。此行數是CBO決定執行查詢的最佳方式的因素。鑑於行數的巨大差異,我不希望計劃是相同的。

根據情況優化可以選擇全表掃描20000行(開發),它可以決定一個指標是對具有200,000行(產品)表更低的成本表。 (數字僅用於演示,CBO使用成本算法來確定FTS以及索引掃描的內容,而不是絕對值)。

3)系統統計數據也包含在解釋計劃中。這是一組代表CPU和磁盤I/O特性的統計數據。如果你的硬件在兩個系統上都不一樣,那麼我希望你的系統統計信息是不同的,這可能會影響計劃。 Jonathan Lewis的一些很好的討論here 您可以通過sys.aux_stats $視圖查看系統狀態。

現在,我不知道爲什麼不同的計劃是給你一個不好的事情......如果統計數據是最新的和參數設置正確,你應該從任一系統不管在規模上的差異越來越不俗的表現..

但是可以從您的Prod系統導出統計信息並將它們加載到您的Dev系統中。這使您的開發數據庫可以使用您的產品統計信息。

檢查DBMS_STATS程序包的Oracle文檔,特別是EXPORT_SCHEMA_STATS,EXPORT_SYSTEM_STATS,IMPORT_SCHEMA_STATS和IMPORT_SYSTEM_STATS過程。請記住,您可能需要在10g/11g上禁用晚上10點的每晚統計作業......或者您可以調查導入後的鎖定統計信息,以便它們不會被夜間作業更新。