Oracle

Oracle 動態抽樣

  • January 2, 2017

優化器將嘗試使用預設數據庫統計資訊而不是動態統計資訊。在某些情況下,oracle 會自動使用動態統計資訊。

  • 並行執行
  • 缺少統計數據
  • 過時的統計數據
  • 統計不足
  • 有 sql 計劃指令

我的問題是,如果在缺少索引統計資訊的列上具有高度選擇性過濾器的 SQL 語句,它會從動態採樣中受益嗎?

動態採樣的好處取決於基數估計錯誤的程度以及在糾正這些錯誤後查詢計劃如何變化。您的查詢可能會受益,對您來說,下一步是DYNAMIC_SAMPLING在查詢中添加提示並觀察 EXPLAIN PLAN 如何更改。但是,更好的解決方案是僅修復您的統計資訊。所有查詢都將從中受益,而不僅僅是您手動調整的查詢。

在我觀察到的工作負載中,從動態採樣中受益最多的查詢是相反的:優化器估計從一個大表中返回的行很少,這會導致整個計劃中的嵌套循環連接和索引使用。如果優化器知道大表返回了很多行,它會選擇一個更好的計劃。假設以下查詢返回 100% 的數據X_TABLE

SELECT COUNT(*)
FROM X_TABLE
WHERE NULLIF(X_COLUMN.NETWORKED_ID, 'X') IS NOT NULL;

在我的機器上,Oracle 使用表中 5% 的行的基數估計。這是在優化器沒有足夠資訊的某些情況下使用的預設基數估計。如果我添加動態採樣提示,則估計值是固定的:

SELECT /*+ DYNAMIC_SAMPLING(X_TABLE 10) */ COUNT(*)
FROM X_TABLE
WHERE NULLIF(X_COLUMN.NETWORKED_ID, 'X') IS NOT NULL;

我的經驗法則是對小表使用 10 的採樣級別,而對大表使用小於 10 的採樣級別。如果您使用 10,那麼 Oracle 將在生成 EXPLAIN PLAN 之前從表中讀取所有塊。

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