傳說中的“謂詞越界“場景
開發環境,碰見一個謂詞越界的問題,模擬這條SQL,如下所示,其中A_ID是表test的外來鍵,並且存在索引,
這張表的資料量,大約10萬,
檢視select 1這條SQL的10053,
看見提示,#2這列,即A_ID,對於超出範圍的、不存在的值,使用0.000002作為選擇率,即這種選擇率,是預估的值,不是實際計算的,換句話說,有可能對執行成本的計算,產生偏差,
Using prorated density: 0.000002 of col #2 as selectvity of out-of-range/non-existent value pred
我們從這張表,A_ID欄位實際的儲存,看下是否存在他所說的,“超出範圍”,
上述結果展示,A_ID的取值範圍是6006992-6052756,而trace中,標記A_ID的min和max則是5586857-5726449,因此,這條SQL,出現了傳說中的“謂詞越界”,
Min: 5586857 Max: 5726449
trace中的min和max,怎麼得來的?他是讀取的dba_tab_col_statistics檢視,通過換算得到的,
但是慶幸的是,雖然出現了謂詞越界的問題,並沒有因為成本值計算偏差,導致CBO選擇錯誤的執行計劃,我覺得和這條SQL的謂詞條件比較簡單,有一定的關係,可選擇的執行計劃就這兩種,
因此這個案例中,雖然出現了“謂詞越界”,對COST的計算,會有誤差,但並未影響執行計劃的選擇,如果是一條謂詞複雜的SQL,包含多種執行計劃的可能,出現“謂詞越界”,選錯執行計劃,形成效能問題,就是大概率了。
解決方法,就是重採集統計資訊,以讓COST的計算,更接近實際,避免使用預設值,讓CBO作出正確選擇。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7192724/viewspace-2286274/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C++謂詞C++
- Java 8謂詞鏈Java
- 說說對WebSocket的理解?應用場景?Web
- 首席說|NLP場景應用中的可解釋性
- java8-謂詞(predicate)Java
- 小解謂詞 access 與 filterFilter
- Partition 表掃描的過程,使用key作為謂詞與使用非key值做謂詞....
- 原子謂詞公式和合式公式公式
- 大資料SQL中的Join謂詞下推,真的那麼難懂?大資料SQL
- 說一說V-Layout框架的原理和使用場景框架
- 說說你對棧、佇列的理解?應用場景?佇列
- C#2.0謂詞的簡單應用C#
- 優化擁有謂詞or的子查詢優化
- TCP之RST傳送場景TCP
- 【大資料】SparkSql連線查詢中的謂詞下推處理(一)大資料SparkSQL
- 【大資料】SparkSql 連線查詢中的謂詞下推處理 (二)大資料SparkSQL
- 【TUNE_ORACLE】列出SQL謂詞中需要建立索引的列SQL參考OracleSQL索引
- 說說你對堆的理解?如何實現?應用場景?
- 大伽「趣」說AI:在多個場景中的AI落地實踐AI
- C++中傳指標和傳引用的區別,各自的使用場景是什麼C++指標
- Redis 中 BitMap 的使用場景Redis
- 說說你對vue的mixin的理解,有什麼應用場景?Vue
- SQL 改寫系列七:謂詞移動SQL
- SQL 改寫系列六:謂詞推導SQL
- 謂詞條件是is null走索引嗎?Null索引
- 說說HTTP 常見的狀態碼有哪些,適用場景?HTTP
- 遊戲場景中的光影設計遊戲
- Unity製作遊戲中的場景Unity遊戲
- 說說你對選擇排序的理解?如何實現?應用場景?排序
- 說說你對歸併排序的理解?如何實現?應用場景?排序
- 【SQL】Oracle查詢轉換之謂詞推送SQLOracle
- MVP那些事兒(1) 用場景說話MVP
- MaxComputeTunnel上傳典型問題場景
- 阿里一面,說說你瞭解zookeeper的應用場景有哪些?阿里
- C++ 一元謂詞對應的lambda表示式C++
- Redis 中 HyperLogLog 的使用場景Redis
- 說說不知道的Golang中引數傳遞Golang
- 【面試被虐】說說遊戲中的敏感詞過濾是如何實現的?面試遊戲