日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Oracle统计信息不准(谓词越界)造成的性能问题

發布時間:2025/7/14 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle统计信息不准(谓词越界)造成的性能问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

什么是謂詞越界?謂詞越界其實就是SQL語句的查詢條件超出了數據庫統計信息所記錄的范圍。謂詞越界會導致Oracle優化器錯誤的選擇SQL語句的執行計劃,導致性能問題。

這里舉一個簡單的例子說明謂詞越界導致優化器選擇了錯誤的執行計劃。

create table t1 (col1 number); create index idx_t1 on t1(col1);beginfor i in 1..10000 loopinsert into t1 values (i);end loop;commit; end; /

這里創建了t1表,并在col1列上創建了索引,并向表里寫入了10000條數據。提供過對t1表收集統計信息,可以得到目前表t1的謂詞情況。

SQL> exec dbms_stats.gather_table_stats('SALP','T1'); SQL> select low_value,high_value from dba_tab_col_statistics where table_name='T1' and owner='SALP';LOW_VALUE HIGH_VALUE ---------- ---------- C102 C302SQL> var x number; SQL> exec dbms_stats.convert_raw_value('C102',:x);PL/SQL procedure successfully completed.SQL> select :x from dual;:X ----------1SQL> exec dbms_stats.convert_raw_value('C302',:x);PL/SQL procedure successfully completed.SQL> select :x from dual;:X ----------10000

上面用到了一個系統包,把統計信息表里的上下限裸數據轉換成可讀的數值。

在謂詞范圍內的條件查詢的執行計劃為

explain plan for select * from t1 where col1 between 1 and 10000; select * from table(dbms_xplan.display); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- Plan hash value: 1387720244 ------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 10000 | 40000 | 7 (0)| 00:00:01 | |* 1 | INDEX FAST FULL SCAN| IDX_T1 | 10000 | 40000 | 7 (0)| 00:00:01 | ------------------------------------------------------------------------------- Predicate Information (identified by operation id): ---------------------------------------------------1 - filter("COL1">=1 AND "COL1"<=10000) 13 rows selected.

因為這里的條件包含了t1表內的所有數據,所以采用多塊讀且不需要回表的執行計劃是最優的(table access full/index fast full scan),這里實際使用的是index fast full scan。

接下來繼續向t1表寫入數據

beginfor i in 10001..10000000 loopinsert into t1 values (i);end loop;commit; end; /

在不重新收集統計信息的情況下,檢查表的統計信息

select low_value,high_value from dba_tab_col_statistics where table_name='T1' and owner='SALP';LOW_VALUE HIGH_VALUE ---------- ---------- C102 C302

現在來進行一次謂詞越界的查詢,使用謂詞條件 col1 between 10001 and 10000000。按道理來說,這種選擇表里99.9%數據的語句應該使用多塊讀且不回表的執行計劃(table access full/index fast full scan)。我們來實際試驗一下。

SQL> set timing on; SQL> Select count(*) from t1 where col1 between 10001 and 10000000;COUNT(*) ----------9990000Elapsed: 00:00:11.17 SQL> select * from table(dbms_xplan.display_cursor(null,null,'advanced'));PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- SQL_ID 86kr1tnhns36d, child number 0 ------------------------------------- Select count(*) from t1 where col1 between 10001 and 10000000Plan hash value: 1970818898---------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ---------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 2 (100)| | | 1 | SORT AGGREGATE | | 1 | 4 | | | |* 2 | INDEX RANGE SCAN| IDX_T1 | 1 | 4 | 2 (0)| 00:00:01 | ----------------------------------------------------------------------------

可以看到這條語句執行了11s才出結果,且執行計劃選擇的是單塊讀的index range scan,而不是我們期望的多塊讀不回表的兩種執行計劃之一且返回的Rows和Bytes出現了嚴重預估錯誤。

我們重新為t1表收集一次統計信息,再次執行同樣的語句并檢查執行計劃。

SQL> exec dbms_stats.gather_table_stats('SALP','T1');PL/SQL procedure successfully completed. Elapsed: 00:00:07.92 SQL> select count(*) from t1 where col1 between 10001 and 10000000;COUNT(*) ----------9990000Elapsed: 00:00:00.31 SQL> select * from table(dbms_xplan.display_cursor(null,null,'advanced'));PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- SQL_ID g47843nv7gsdq, child number 0 ------------------------------------- select count(*) from t1 where col1 between 10001 and 10000000Plan hash value: 3724264953--------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 4434 (100)| | | 1 | SORT AGGREGATE | | 1 | 6 | | | |* 2 | TABLE ACCESS FULL| T1 | 9990K| 57M| 4434 (2)| 00:00:01 | ---------------------------------------------------------------------------

這次走出了我們希望的執行計劃(table access full),預估的Rows和Bytes也都正常了,且語句花了310ms就運行完了。

?

謂詞越界一般會發生在什么場景下?

1 臨時表

這里指的是業務上的臨時表而不是Oracle數據庫本身的temporary table。在某些系統中會根據業務條件創建前臺表和后臺表,數據先進入前臺表,處理完畢后,存入后臺表,并用delete語句清理前臺表的數據,前臺表起到一個臨時表的作用。我們知道,Oracle自動收集統計信息的默認時間窗口是工作日晚上的22點到凌晨2點,或者周末的早上6點到第二天凌晨2點。在自動收集統計信息窗口內,數據庫前臺表基本上處于無數據,或者數據量很小的情況,那么產生的統計信息就會和白天實際處理業務數據時有偏差,就有可能發生謂詞越界的情況。

2 巨大表

Oracle觸發自動收集某個表的統計信息的條件是表中修改的數據量超過該表數據總量的10%,假設一個表每天新增1w條數據,一年后這個表變成了365w條數據,那么這意味著這個表需要再過一個多月才會觸發一次自動收集統計信息的作業。那么在這個表上的謂詞查詢,尤其是時間、序列等自增條件上的查詢,就可能發生謂詞越界的情況,影響優化器正確選擇執行計劃。

轉載于:https://www.cnblogs.com/aegis1019/p/9059220.html

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的Oracle统计信息不准(谓词越界)造成的性能问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 色噜噜狠狠一区二区三区 | av网址观看 | 天天操天天操天天操天天操 | 男女精品视频 | 亚洲经典一区二区三区 | 91香蕉视频官网 | 涩涩视频免费在线观看 | 久久精品视频中文字幕 | 精品人成| 婷婷激情五月综合 | 精品视频91| 国模叶桐尿喷337p人体 | 亚洲男人影院 | 驯服少爷漫画免费观看下拉式漫画 | 国产精品成人久久久久 | 精品免费视频 | 一本色道久久综合狠狠躁的推荐 | 国产精品成人免费一区二区视频 | 日韩在线视频一区 | 成人必看www. | 欧美成人精品一区 | 夜夜摸视频网 | 美日韩av在线 | av激情久久 | 色播五月婷婷 | 美女作爱网站 | 久草综合网 | 日韩色区 | 丰满熟妇乱又伦 | 日本视频中文字幕 | 亚洲天堂中文字幕在线观看 | 夜色综合| а 天堂 在线 | 国产精品久久久久久久久久久久久久 | 亚洲成人精品 | 欧美成人国产精品高潮 | 神马影院午夜伦理片 | 国产精品三级在线观看无码 | 91精品91久久久中77777老牛 | 天堂…中文在线最新版在线 | 一区二区三区精品久久久 | 69精品丰满人妻无码视频a片 | 日韩亚洲欧美综合 | 娇小萝被两个黑人用半米长 | 国产精品久久久久久99 | www.猫咪av.com | 饥渴少妇伦色诱公 | 男女av| 最新日韩av | 台湾三级伦理片 | 国产成人在线免费观看视频 | 亚洲激情视频在线 | jizz网站| 久久久久97| 福利网址在线观看 | 免费一级做a爰片久久毛片潮 | 色女生影院 | 天堂福利视频 | 精品一区二区中文字幕 | 免费无码毛片一区二三区 | www.avcao| 欧美一区二区最爽乱淫视频免费看 | 久久一区精品 | 冲田杏梨av | 夜夜躁狠狠躁日日躁av | 久久久久久香蕉 | 日韩成人动漫在线观看 | 日本黄色免费观看 | 亚洲精品久久久久久国产精华液 | 欧美色第一页 | 亚洲色图 在线视频 | 久久成| 国产宾馆实践打屁股91 | 一个人看的www视频在线观看 | 黄色片不卡 | 欧美贵妇videos办公室 | 人成午夜 | 岛国av网站 | 色综合狠狠操 | 国产寡妇亲子伦一区二区三区四区 | 伊人影片 | 久久久精品999 | 亚洲av永久无码精品一百度影院 | 久久久国产精品视频 | www.成年人 | 精品人妻一区二区三区四区不卡 | 国产精品自拍第一页 | 婷婷成人av | 狠狠爱免费视频 | 中文在线一区二区三区 | 国产精品久久久久久妇女 | 亚洲自偷自偷偷色无码中文 | 欧美精品动漫 | 丰满雪白极品少妇流白浆 | 欧产日产国产精品98 | 福利网址在线观看 | 一区二区三区在线不卡 | 国产亚洲三级 | 国产成人av免费看 |