統計資訊不準導致執行計畫出錯跑不出結果,最佳化後只要1分鐘,統計資訊執行計畫
一天查看資料庫長會話,發現1個sql跑得很慢,1個多小時不出結果,花了點時間把它給最佳化了。
最佳化前:
SELECT 20131023, "A2"."ORG_ID", COUNT(DISTINCT NLSSORT(CASE "A2"."RES_TYPE" WHEN 'DP' THEN "A2"."RES_CODE" END, 'nls_sort=''BINARY''')), COUNT(DISTINCT NLSSORT(CASE "A2"."RES_TYPE" WHEN 'BOX' THEN "A2"."RES_CODE" END, 'nls_sort=''BINARY''')), COUNT(DISTINCT NLSSORT(CASE "A2"."RES_TYPE" WHEN 'ONU' THEN "A2"."RES_CODE" END, 'nls_sort=''BINARY''')), COUNT(DISTINCT NLSSORT(CASE "A2"."RES_TYPE" WHEN 'OBD' THEN "A2"."RES_CODE" END, 'nls_sort=''BINARY''')), COUNT(DISTINCT NLSSORT(CASE WHEN ("A1"."CON_TYPE" = '001' AND "A2"."RES_TYPE" = 'DP') THEN "A1"."RES_ID" END, 'nls_sort=''BINARY''')), COUNT(DISTINCT NLSSORT(CASE WHEN ("A1"."CON_TYPE" = '002' AND "A2"."RES_TYPE" = 'BOX') THEN "A1"."RES_ID" END, 'nls_sort=''BINARY''')), COUNT(DISTINCT NLSSORT(CASE WHEN ("A1"."CON_TYPE" = '0011' AND "A2"."RES_TYPE" = 'ONU') THEN "A1"."RES_ID" END, 'nls_sort=''BINARY''')), COUNT(DISTINCT NLSSORT(CASE WHEN ("A1"."CON_TYPE" = '0022' AND "A2"."RES_TYPE" = 'OBD') THEN "A1"."RES_ID" END, 'nls_sort=''BINARY''')) FROM "CRM_SZ"."AAA" "A2", "CRM_SZ"."BBB" "A1" WHERE "A1"."RES_ID"(+) = "A2"."RES_CODE" GROUP BY "A2"."ORG_ID"執行計畫:Plan hash value: 2627707252 ---------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |---------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 1 | 1065 | 3 (34)| 00:00:01 || 1 | SORT GROUP BY | | 1 | 1065 | 3 (34)| 00:00:01 || 2 | NESTED LOOPS OUTER| | 1 | 1065 | 2 (0)| 00:00:01 || 3 | TABLE ACCESS FULL| AAA | 1 | 539 | 2 (0)| 00:00:01 ||* 4 | INDEX FULL SCAN | IX_MO_CON_VALUE | 1 | 526 | 0 (0)| 00:00:01 |--------------------------------------------------------------------------------------- Predicate Information (identified by operation id):--------------------------------------------------- 4 - access("A1"."RES_ID"(+)="A2"."RES_CODE") filter("A1"."RES_ID"(+)="A2"."RES_CODE")
cbo估算錯了,rows全是1,導致走nl
手工count了一把:
select count(*) from "CRM_SZ"."AAA" ;--1365564
select count(*) from "CRM_SZ"."BBB";--119949
走nl那豈不是sb啦。
第一次最佳化後:
SELECT/*+use_hash(A1,A2) swap_join_inputs(A1)*/20131023, "A2"."ORG_ID", COUNT(DISTINCT NLSSORT(CASE "A2"."RES_TYPE" WHEN 'DP' THEN "A2"."RES_CODE" END, 'nls_sort=''BINARY''')), COUNT(DISTINCT NLSSORT(CASE "A2"."RES_TYPE" WHEN 'BOX' THEN "A2"."RES_CODE" END, 'nls_sort=''BINARY''')), COUNT(DISTINCT NLSSORT(CASE "A2"."RES_TYPE" WHEN 'ONU' THEN "A2"."RES_CODE" END, 'nls_sort=''BINARY''')), COUNT(DISTINCT NLSSORT(CASE "A2"."RES_TYPE" WHEN 'OBD' THEN "A2"."RES_CODE" END, 'nls_sort=''BINARY''')), COUNT(DISTINCT NLSSORT(CASE WHEN ("A1"."CON_TYPE" = '001' AND "A2"."RES_TYPE" = 'DP') THEN "A1"."RES_ID" END, 'nls_sort=''BINARY''')), COUNT(DISTINCT NLSSORT(CASE WHEN ("A1"."CON_TYPE" = '002' AND "A2"."RES_TYPE" = 'BOX') THEN "A1"."RES_ID" END, 'nls_sort=''BINARY''')), COUNT(DISTINCT NLSSORT(CASE WHEN ("A1"."CON_TYPE" = '0011' AND "A2"."RES_TYPE" = 'ONU') THEN "A1"."RES_ID" END, 'nls_sort=''BINARY''')), COUNT(DISTINCT NLSSORT(CASE WHEN ("A1"."CON_TYPE" = '0022' AND "A2"."RES_TYPE" = 'OBD') THEN "A1"."RES_ID" END, 'nls_sort=''BINARY''')) FROM "CRM_SZ"."AAA" "A2", "CRM_SZ"."BBB" "A1" WHERE "A1"."RES_ID"(+) = "A2"."RES_CODE" GROUP BY "A2"."ORG_ID"63 rows selected.Elapsed: 00:00:47.64Execution Plan----------------------------------------------------------Plan hash value: 3074972763------------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |------------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 1 | 1065 | 4 (50)| 00:00:01 || 1 | SORT GROUP BY | | 1 | 1065 | 4 (50)| 00:00:01 ||* 2 | HASH JOIN RIGHT OUTER| | 1 | 1065 | 3 (34)| 00:00:01 || 3 | INDEX FULL SCAN | IX_MO_CON_VALUE | 1 | 526 | 0 (0)| 00:00:01 || 4 | TABLE ACCESS FULL | AAA | 1 | 539 | 2 (0)| 00:00:01 |------------------------------------------------------------------------------------------Predicate Information (identified by operation id):--------------------------------------------------- 2 - access("A1"."RES_ID"(+)="A2"."RES_CODE")Statistics---------------------------------------------------------- 1065 recursive calls 3 db block gets 13375 consistent gets 16369 physical reads 0 redo size 4862 bytes sent via SQL*Net to client 791 bytes received via SQL*Net from client 6 SQL*Net roundtrips to/from client 12 sorts (memory) 1 sorts (disk) 63 rows processed
第二次最佳化後:
SELECT/*+use_hash(A1,A2) full(A1) full(A2) parallel(A1,5) parallel(A2,5) swap_join_inputs(A1)*/20131023, "A2"."ORG_ID", COUNT(DISTINCT NLSSORT(CASE "A2"."RES_TYPE" WHEN 'DP' THEN "A2"."RES_CODE" END, 'nls_sort=''BINARY''')), COUNT(DISTINCT NLSSORT(CASE "A2"."RES_TYPE" WHEN 'BOX' THEN "A2"."RES_CODE" END, 'nls_sort=''BINARY''')), COUNT(DISTINCT NLSSORT(CASE "A2"."RES_TYPE" WHEN 'ONU' THEN "A2"."RES_CODE" END, 'nls_sort=''BINARY''')), COUNT(DISTINCT NLSSORT(CASE "A2"."RES_TYPE" WHEN 'OBD' THEN "A2"."RES_CODE" END, 'nls_sort=''BINARY''')), COUNT(DISTINCT NLSSORT(CASE WHEN ("A1"."CON_TYPE" = '001' AND "A2"."RES_TYPE" = 'DP') THEN "A1"."RES_ID" END, 'nls_sort=''BINARY''')), COUNT(DISTINCT NLSSORT(CASE WHEN ("A1"."CON_TYPE" = '002' AND "A2"."RES_TYPE" = 'BOX') THEN "A1"."RES_ID" END, 'nls_sort=''BINARY''')), COUNT(DISTINCT NLSSORT(CASE WHEN ("A1"."CON_TYPE" = '0011' AND "A2"."RES_TYPE" = 'ONU') THEN "A1"."RES_ID" END, 'nls_sort=''BINARY''')), COUNT(DISTINCT NLSSORT(CASE WHEN ("A1"."CON_TYPE" = '0022' AND "A2"."RES_TYPE" = 'OBD') THEN "A1"."RES_ID" END, 'nls_sort=''BINARY''')) FROM "CRM_SZ"."AAA" "A2", "CRM_SZ"."BBB" "A1" WHERE "A1"."RES_ID"(+) = "A2"."RES_CODE" GROUP BY "A2"."ORG_ID";63 rows selected.Elapsed: 00:00:10.21Execution Plan----------------------------------------------------------Plan hash value: 4044842257-------------------------------------------------------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |-------------------------------------------------------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 1 | 1065 | 6 (34)| 00:00:01 | | | || 1 | PX COORDINATOR | | | | | | | | || 2 | PX SEND QC (RANDOM) | :TQ10004 | 1 | 1065 | 6 (34)| 00:00:01 | Q1,04 | P->S | QC (RAND) || 3 | SORT GROUP BY | | 1 | 1065 | 6 (34)| 00:00:01 | Q1,04 | PCWP | || 4 | PX RECEIVE | | 1 | 1065 | 6 (34)| 00:00:01 | Q1,04 | PCWP | || 5 | PX SEND HASH | :TQ10003 | 1 | 1065 | 6 (34)| 00:00:01 | Q1,03 | P->P | HASH || 6 | SORT GROUP BY | | 1 | 1065 | 6 (34)| 00:00:01 | Q1,03 | PCWP | || 7 | PX RECEIVE | | 1 | 1065 | 6 (34)| 00:00:01 | Q1,03 | PCWP | || 8 | PX SEND HASH | :TQ10002 | 1 | 1065 | 6 (34)| 00:00:01 | Q1,02 | P->P | HASH || 9 | SORT GROUP BY | | 1 | 1065 | 6 (34)| 00:00:01 | Q1,02 | PCWP | ||* 10 | HASH JOIN RIGHT OUTER| | 1 | 1065 | 5 (20)| 00:00:01 | Q1,02 | PCWP | || 11 | PX RECEIVE | | 1 | 526 | 2 (0)| 00:00:01 | Q1,02 | PCWP | || 12 | PX SEND HASH | :TQ10000 | 1 | 526 | 2 (0)| 00:00:01 | Q1,00 | P->P | HASH || 13 | PX BLOCK ITERATOR | | 1 | 526 | 2 (0)| 00:00:01 | Q1,00 | PCWC | || 14 | TABLE ACCESS FULL| BBB | 1 | 526 | 2 (0)| 00:00:01 | Q1,00 | PCWP | || 15 | PX RECEIVE | | 1 | 539 | 2 (0)| 00:00:01 | Q1,02 | PCWP | || 16 | PX SEND HASH | :TQ10001 | 1 | 539 | 2 (0)| 00:00:01 | Q1,01 | P->P | HASH || 17 | PX BLOCK ITERATOR | | 1 | 539 | 2 (0)| 00:00:01 | Q1,01 | PCWC | || 18 | TABLE ACCESS FULL| AAA | 1 | 539 | 2 (0)| 00:00:01 | Q1,01 | PCWP | |-------------------------------------------------------------------------------------------------------------------------------------Predicate Information (identified by operation id):--------------------------------------------------- 10 - access("A1"."RES_ID"(+)="A2"."RES_CODE")Statistics---------------------------------------------------------- 585 recursive calls 4 db block gets 14267 consistent gets 13126 physical reads 808 redo size 4888 bytes sent via SQL*Net to client 840 bytes received via SQL*Net from client 6 SQL*Net roundtrips to/from client 23 sorts (memory) 0 sorts (disk) 63 rows processed
最佳化前,執行計畫走了nl,1個多小時查不出結果
第一次最佳化後,首次00:00:47.64可以出結果
第二次最佳化後,首次00:00:10.21出結果,重複執行(有緩衝)的情況下3s出結果。
我的機子越來越慢自動啟動並執行程式越來越多殺毒軟體也查不出有病毒來我該怎辦
開始-運行-msconfig-啟動-去掉無關程式前面的勾選。
清理系統垃圾,整理磁碟片段。
中考複習計劃
我是一名應屆的初三畢業生,回顧過去這不平凡的一年,我認為儘早制訂好適合自己的學習計劃並付諸於行動,從淺入深、由易至難、從熟到精、成竹在胸,才能在中考中穩定地發揮出自己應有的水平,取得較理想的成績。 需考的六門學科每門都很重要,不能因分值的高低而重“大三”,輕“小三”,要同等看待。而制訂複習計劃首先要清楚地瞭解自己學習的現狀———既明白自己擅長的是什麼,不擅長的是什麼。擅長的地方要繼續保持,並時常再鞏固一下做到熟能生巧。不擅長的則一個地方都不可以漏掉,要全部都記下來,然後根據這些整理出來的條目一條一條解決,抓緊時間一點一點認真仔細地把這些“硬骨頭”消化掉。把不會的變為擅長的,做到能靈活運用,不出任何差錯。 語文是一門人文性和思想性相結合的學科,非常重要,而其重頭戲當然就是作文了。寫作文除了要把題目審清,此外材料也是關鍵。而這就在於對生活的仔細觀察和平日的積累。能不能發現生活中別人發現不了的一些小事,能不能運用到作文中去,寫出別人沒有想到的、全新的內容,就可大大提高文章的得分率。當然,就算寫老材料,可以在舊中出新,寫出真情實感、讓人感動,文筆老練,也不失為一篇成功的作文。我認為,平時還可以看一些好的作文選,並不是當故事書看,而是瞧一瞧別人的材料,別人的寫作方法,寫作特色、布局等,是如何把一件平凡的事講述得生動有趣的,是如何讓語句更緊湊、立意更高遠的,是如何將主題加以深化的。這樣做一下參考,把平時發生在自己身上或身邊的事多留心一下,多準備一些,臨場就不會覺得無事可寫而慌亂了。接著便是閱讀理解。閱讀能力不是一朝一夕就能培養成的,需要日久的積累和點滴的匯聚。平時每次做完了練習對完了答案,應該認真去體會,深入地瞭解什麼樣的問題應該怎樣回答,掌握好一些解題技巧,聯絡全文、綜合分析總結概括,解讀作者寫作意圖,逐步提升自己的閱讀水平,這樣,抓住了文章的中心,題目也就一道道迎刃而解了。最後剩下的古文則完全要靠下苦工夫了。平時要多背多默,做到一字不漏、一字不添、一字不錯,一分不失。解釋也要字字落實,可以用一本本子做一下整理,多複印幾份,每天堅持做一些。到考試前便已爛熟於胸,只要再看看每篇古文的文學常識,瞭解其中心思想,不必再多花時間去背啊默了。 解數理化的題目除了要心細,概念也很重要。我把中學裡所有有關的概念全部整理出來一一背熟。我認為這樣對解題會更有協助。特別是化學,也經常會出一些概念性的題目。至於數學,我認為平時做練習時可自己總結出一些規律、公式(如RT三角形內切圓半徑為a+b-c/2)。這樣在做一些題目時便可省下很多時間,比別人就快得多了。還有就是要有一點鑽研精神,我以前數學最後一道12分的題目總是做不全,但我並不放棄,認真努力地去想,多挑一些這種題目去練,這樣才會做到不失一分。 英語單詞非常重要,我每兩天背一頁考綱後面的單詞,其實裡面大多數都是曾背過的,並不難。每天的量也不多,但一定要做到牢記。平時也要多讀一些英語書籍。這裡,我強調一個“讀”字。讀的多了,自然而然就會有語感,會有一種感覺,特別是做第二部分選擇題時,有時有的題目吃不準,就讀讀看感覺一下,說不定答案就會出來了。當然這隻是我個人的方法,我認為很有用。但多讀,肯定是不會錯的。當然了,文法也相當重要,一定要弄得明明白白,記得清清楚楚才行,否則很難把題目做對。 至於政治,就只有一個秘訣了,那就是一個字,“熟”。雖然現在已經取消了閉卷,全都採用開卷的方式。但還是應該對書、對考綱非常熟悉,仍然要做到一看到題目就知道其是在考綱上的第幾頁。只有夠快、夠熟練,才能得高分。 說了那麼多,其實這些都是我在初三這整個一年......餘下全文>>