Oracle

為全域臨時表的查詢創建解釋計劃

  • July 4, 2017

我有一個查詢,它從全域臨時表中聚合數據。該表將在聚合之前填充。我的目標是為該查詢提供可靠的解釋計劃。

OracleDBMS 中有沒有一種方法可以模擬臨時表的填充級別,而無需插入任何內容?

例子

普通查詢:

INSERT INTO gtt VALUES(..)
SELECT * FROM gtt

解釋計劃:

EXPLAIN PLAN FOR SELECT * FROM gtt /* with hint for maybe 10k records */

**動機:**目標是找出語句是否低於成本和 CPU 的門檻值。我們想知道,什麼樣的臨時數據或有多少數量的臨時數據破壞了我們的調整概念。

出於測試目的,您可以在 GTT 中插入數據、收集統計資訊和鎖定統計資訊。這將使您在另一個會話中獲得解釋計劃,就好像您的 GTT 在那裡有數據一樣。完成測試後,您應該解鎖統計資訊。

我很想知道你為什麼有這個要求。從 Oracle 12c 開始,GTT 預設具有會話私有統計資訊。您可以在插入後簡單地收集統計資訊。在 Oracle 11g 上,如果您保證一次只有一個會話查詢 GTT,您仍然可以安全地收集有關 GTT 的統計資訊。否則,您可以刪除統計資訊,鎖定它們,並依靠動態採樣來獲取有關表的統計資訊。如果您的預設動態採樣級別不夠,您可以使用/*+ dynamic_sampling({alias} {level}) */提示在查詢級別為 GTT 設置一個級別。另一種選擇是載入具有代表性的數據量並鎖定統計資訊。

並不真地; 但如果目標是提高在 GTT 中聚合資訊的查詢的性能,如果您的 Oracle 版本為 10g 或更高,您可以將 OPTIMIZER_DYNAMIC_SAMPLING 設置為 5 或更高。

這將鼓勵 Oracle 的優化器通過執行一些抽樣查詢更加努力地確定最佳計劃。

您可以通過提示使用它:

SELECT /*+ OPT_PARAM('OPTIMIZER_DYNAMIC_SAMPLING' '5') */ * from gtt;

引用自:https://dba.stackexchange.com/questions/177850