2014-09-25 84 views
1

我有一個oracle sql查詢,它有訪問計劃附加到它。如何在不更改sql查詢的情況下更改訪問計劃。我認爲甲骨文有數據庫表存儲SQL ID和計劃ID,更新計劃ID到新計劃ID將強制SQL查詢使用不同的解釋計劃。如何更改oracle解釋計劃爲sql查詢手動

我使用Oracle 10,在這種情況下,我不想觸摸現有的查詢。我將用提示編寫另一個查詢並獲得所需的解釋計劃。現在我將使用解釋計劃的新標記並將其附加到原始的sql id。這是如何做到這一點的邏輯,但我不知道所有表需要更新來實現這一點。第一步:SQLI_D1 - > PLAN_ID1;第二步:SQL_ID2 - > PLAN_ID2; STep3:SQL_ID1 - > PLAN_ID2

+0

爲什麼你想這樣做 - 因爲你認爲Oracle選擇了一個次優計劃? Oracle是否擁有制定合理計劃所需的所有信息 - 特別是統計信息是否最新?或者,如果你使用10g,你是否可能受到綁定變量窺視的困擾? (這對11g來說不是問題)。您可以向優化器提供提示,但這會改變語句,並且通常會隱藏一個潛在問題。 – 2014-09-25 10:19:42

回答

0

答案太多,因爲你的問題太廣泛了。而你甚至沒有提到數據庫版本。

你說:

更新計劃ID,以新的計劃ID將強制SQL查詢使用 不同的解釋計劃。

編號PLAN_HASH_VALUE由Oracle分配。這是將EXECUTION PLAN與各自的SQL_ID關聯的標記。如果您想強制OPTIMIZER採取您選擇的不同執行計劃,則可以在查詢中使用HINTS

如果你有固定或保藏的使用stored outlines等爲SQL執行計劃,也被稱爲PLAN STABILITY,那麼你需要在它的旁邊,將其刪除,因此,甲骨文將能夠找到一個妥善的執行計劃執行。然後,如果需要,您可以按照您的想法穩定更好的計劃。

+0

我正在使用Oracle 10,在這種情況下,我不想觸摸現有查詢。我將用提示編寫另一個查詢並獲得所需的解釋計劃。現在我將使用解釋計劃的新標記並將其附加到原始的sql id。這是如何做到這一點的邏輯,但我不知道所有表需要更新來實現這一點。第一步:SQLI_D1 - > PLAN_ID1;第二步:SQL_ID2 - > PLAN_ID2; STep3:SQL_ID1 - > PLAN_ID2 – sorab 2014-09-25 12:19:20

0

解釋計劃取決於其查詢和統計數據。例如,如果表中只有一條記錄,oracle將不會使用索引,但如果表中有很多記錄,並且只提取其中的幾條,它將使用索引。所以你需要儘可能地收集統計數據。

但我不明白你打算強制oracle重新計算解釋計劃,Oracle知道如何根據你提供的統計信息訪問你的表。不要使用像INDEX和其他告訴oracle如何訪問表的提示。你可以給甲骨文一個提示,告訴甲骨文你只需要5行,而甲骨文會盡快將它們還給你。

+0

>如果表中只有一條記錄,oracle將不會使用索引.... ***你確定嗎?***我可以告訴你,Oracle將使用索引在表中只有一行。 – 2014-09-25 10:36:15

+1

[Tottaly](http:// pastebin。com/2ZM0Srxx) – zaratustra 2014-09-25 10:39:25

+0

@LalitKumarB - 如果它的選擇性意味着做一個單獨的索引和表提取會更昂貴,它通常不會使用索引。爲什麼只有兩個I/O只能使用一個?單排只是一個極端的例子。 (我忘記了什麼時候能夠更有效地達到索引的閾值,但我曾經使用10-15%作爲經驗法則)。 zaratustra的演示也使用了明確的'gather_schema_stats()'。 – 2014-09-25 10:41:50