Oracle11g怎么收集多列統(tǒng)計(jì)信息

這篇文章主要介紹“Oracle 11g怎么收集多列統(tǒng)計(jì)信息”,在日常操作中,相信很多人在Oracle 11g怎么收集多列統(tǒng)計(jì)信息問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”O(jiān)racle 11g怎么收集多列統(tǒng)計(jì)信息”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比丹鳳網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式丹鳳網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋丹鳳地區(qū)。費(fèi)用合理售后完善,十年實(shí)體公司更值得信賴。

        通常,當(dāng)我們將SQL語(yǔ)句提交給Oracle數(shù)據(jù)庫(kù)時(shí),Oracle會(huì)選擇一種最優(yōu)方式來(lái)執(zhí)行,這是通過(guò)查詢優(yōu)化器Query Optimizer來(lái)實(shí)現(xiàn)的。CBO(Cost-Based Optimizer)是Oracle默認(rèn)使用的查詢優(yōu)化器模式。在CBO中,SQL執(zhí)行計(jì)劃的生成,是以一種尋找成本(Cost)最優(yōu)為目標(biāo)導(dǎo)向的執(zhí)行計(jì)劃探索過(guò)程。所謂成本(Cost)就是將CPU和IO消耗整合起來(lái)的量化指標(biāo),每一個(gè)執(zhí)行計(jì)劃的成本就是經(jīng)過(guò)優(yōu)化器內(nèi)部公式估算出的數(shù)字值。

        我們?cè)趯慡QL語(yǔ)句的時(shí)候,經(jīng)常會(huì)碰到where子句后面有多個(gè)條件的情況,也就是根據(jù)多列的條件篩選得到數(shù)據(jù)。默認(rèn)情況下,oracle會(huì)把多列的選擇率(selectivity)相乘從而得到where語(yǔ)句的選擇率,這樣有可能造成選擇率(selectivity)不準(zhǔn)確,從而導(dǎo)致優(yōu)化器做出錯(cuò)誤的判斷。為了能夠讓優(yōu)化器做出準(zhǔn)確的判斷,從而生成準(zhǔn)確的執(zhí)行計(jì)劃,oracle在11g數(shù)據(jù)庫(kù)中引入了收集多列統(tǒng)計(jì)信息。本文通過(guò)對(duì)測(cè)試表的多條件查詢,介紹收集多列統(tǒng)計(jì)信息的重要性。

1.環(huán)境準(zhǔn)備

我們?cè)贠racle 11g中進(jìn)行試驗(yàn)。

此處)折疊或打開

  1. SQL>

  2. SQL> explain plan for select * from hoegh where employee_id=110 and email=\'JCHEN\';

  3. Explained.

  4. SQL>

  5. SQL> select * from table(dbms_xplan.display);

  6. PLAN_TABLE_OUTPUT

  7. --------------------------------------------------------------------------------

  8. Plan hash value: 774871165

  9. ---------------------------------------------------------------------------

  10. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

  11. ---------------------------------------------------------------------------

  12. | 0 | SELECT STATEMENT | | 1 | 69 | 8 (0)| 00:00:01 |

  13. |* 1 | TABLE ACCESS FULL| HOEGH | 1 | 69 | 8 (0)| 00:00:01 |

  14. ---------------------------------------------------------------------------

  15. Predicate Information (identified by operation id):

  16. ---------------------------------------------------

  17. PLAN_TABLE_OUTPUT

  18. --------------------------------------------------------------------------------

  19.    1 - filter(\"EMPLOYEE_ID\"=110 AND \"EMAIL\"=\'JCHEN\')

  20. 13 rows selected.

  21. SQL>

從執(zhí)行計(jì)劃可以看出返回了1行記錄,而事實(shí)又是什么樣的呢?我們執(zhí)行一下這條sql語(yǔ)句。

點(diǎn)擊(此處)折疊或打開

  1. SQL> select count(*) from hoegh where employee_id=110 and email=\'JCHEN\';

  2.   COUNT(*)

  3. ----------

  4.         16

  5. SQL>

由此看出,測(cè)試表hoegh符合查詢條件的數(shù)據(jù)有16行,而執(zhí)行計(jì)劃提示的只有1行,出錯(cuò)了。這是怎么回事呢,也就是我們?cè)陂_篇提到的選擇率(selectivity)出了問(wèn)題。
在這個(gè)多列條件查詢語(yǔ)句中,選擇率=1/107*1/107,返回行數(shù)=1/107*1/107*1712=16/107<1;由于表中存在符合條件的記錄,并且返回行數(shù)不可能小于1,所以O(shè)racle返回了1。

5.收集多列統(tǒng)計(jì)信息,再次查看兩個(gè)條件的where語(yǔ)句的執(zhí)行計(jì)劃

點(diǎn)擊(此處)折疊或打開

  1. SQL>

  2. SQL> exec dbms_stats.gather_table_stats(\'HR\',\'HOEGH\',method_opt=>\'for columns(employee_id,email)\');

  3. PL/SQL procedure successfully completed.

  4. SQL>

  5. SQL> explain plan for select * from hoegh where employee_id=110 and email=\'JCHEN\';

  6. Explained.

  7. SQL> select * from table(dbms_xplan.display);

  8. PLAN_TABLE_OUTPUT

  9. --------------------------------------------------------------------------------

  10. Plan hash value: 774871165

  11. ---------------------------------------------------------------------------

  12. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

  13. ---------------------------------------------------------------------------

  14. | 0 | SELECT STATEMENT | | 16 | 1152 | 8 (0)| 00:00:01 |

  15. |* 1 | TABLE ACCESS FULL| HOEGH | 16 | 1152 | 8 (0)| 00:00:01 |

  16. ---------------------------------------------------------------------------

  17. Predicate Information (identified by operation id):

  18. ---------------------------------------------------

  19. PLAN_TABLE_OUTPUT

  20. --------------------------------------------------------------------------------

  21.    1 - filter(\"EMPLOYEE_ID\"=110 AND \"EMAIL\"=\'JCHEN\')

  22. 13 rows selected.

  23. SQL>

從執(zhí)行計(jì)劃的結(jié)果來(lái)看,同樣的一條sql查詢語(yǔ)句,在收集多列統(tǒng)計(jì)信息后,Oracle的選擇率(selectivity)由錯(cuò)變對(duì),這是由于sql語(yǔ)句中的兩個(gè)條件是有關(guān)聯(lián)的,即employee_id和email在employees表中都是唯一的,都可以唯一標(biāo)識(shí)一行記錄;而在收集多列統(tǒng)計(jì)信息之前,Oracle并不知道這兩個(gè)查詢條件有關(guān)聯(lián),所以在計(jì)算選擇率(selectivity)時(shí),只是簡(jiǎn)單地采取了相乘的方法。

到此,關(guān)于“Oracle 11g怎么收集多列統(tǒng)計(jì)信息”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

分享題目:Oracle11g怎么收集多列統(tǒng)計(jì)信息
文章出自:http://www.muchs.cn/article40/gehdho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、App開發(fā)、軟件開發(fā)、ChatGPT、移動(dòng)網(wǎng)站建設(shè)、小程序開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營(yíng)