<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        索引優化min、max的聚合函數

        來源:懂視網 責編:小采 時間:2020-11-09 13:08:06
        文檔

        索引優化min、max的聚合函數

        索引優化min、max的聚合函數:客戶提到最近系統比較慢,采樣了一個awr報表,發現了下面的這個sql語句存執行時間較長 SELECT MAX (dmsample0_.ORD) AS x0_0_ FROM HF_DM_SAMPLE dmsample0_ WHERE (dmsample0_.PROJECT_ID = '000000000001') sele
        推薦度:
        導讀索引優化min、max的聚合函數:客戶提到最近系統比較慢,采樣了一個awr報表,發現了下面的這個sql語句存執行時間較長 SELECT MAX (dmsample0_.ORD) AS x0_0_ FROM HF_DM_SAMPLE dmsample0_ WHERE (dmsample0_.PROJECT_ID = '000000000001') sele

        客戶提到最近系統比較慢,采樣了一個awr報表,發現了下面的這個sql語句存執行時間較長 SELECT MAX (dmsample0_.ORD) AS x0_0_ FROM HF_DM_SAMPLE dmsample0_ WHERE (dmsample0_.PROJECT_ID = '000000000001') select * from table(dbms_xplan.display_cursor

        客戶提到最近系統比較慢,采樣了一個awr報表,發現了下面的這個sql語句存執行時間較長
        SELECT MAX (dmsample0_.ORD) AS x0_0_
        FROM HF_DM_SAMPLE dmsample0_
        WHERE (dmsample0_.PROJECT_ID = '000000000001')

        select * from table(dbms_xplan.display_cursor('3js6cmjycbndh',null));

        SQL_ID 3js6cmjycbndh, child number 0
        -------------------------------------
        select max(dmsample0_.ORD) as x0_0_ from HF_DM_SAMPLE dmsample0_ where
        (dmsample0_.PROJECT_ID='000000000001' )

        Plan hash value: 1698372702

        -----------------------------------------------------------------------------------
        | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
        -----------------------------------------------------------------------------------
        | 0 | SELECT STATEMENT | | | | 5595 (100)| |
        | 1 | SORT AGGREGATE | | 1 | 18 | | |
        |* 2 | TABLE ACCESS FULL| HF_DM_SAMPLE | 139K| 2456K| 5595 (1)| 00:01:08 |
        -----------------------------------------------------------------------------------

        Predicate Information (identified by operation id):
        ---------------------------------------------------

        2 - filter("DMSAMPLE0_"."PROJECT_ID"='000000000001')

        SQL> select num_buckets,num_distinct,num_nulls,histogram from dba_tab_columns where table_name='HF_DM_SAMPLE' and (column_name='PROJECT_ID' or column_name='ORD');

        NUM_BUCKETS NUM_DISTINCT NUM_NULLS HISTOGRAM
        ----------- ------------ ---------- ---------------
        2 2 0 FREQUENCY
        1 137792 0 NONE

        看上去project_id的過濾性很差,這里選擇全表是正常的,但是我們需要注意的是這里查詢其實只需要兩個列PROJECT_ID和ORD

        由于索引是有序的,那么如果建立PROJECT_ID,ORD的聯合索引,這個掃描的過程是從root節點到分支塊節點再到葉塊節點,但是到葉塊節點時只是掃描project_id='000000000001'的對應葉塊節點的第一個葉塊或者最后一個葉塊,而且只掃描第一行或者最后一行數據。,這就是我們常見的index range scan(min/max)而跟平時我們優化所不同的是這里是組合索引。

        create index ind_multi on HF_DM_SAMPLE(PROJECT_ID,ORD);

        SELECT MAX (dmsample0_.ORD) AS x0_0_
        FROM HF_DM_SAMPLE dmsample0_
        WHERE (dmsample0_.PROJECT_ID = '000000000001')

        select * from table(dbms_xplan.display_cursor(null,null));

        SQL_ID 1vjvuktzmxwm3, child number 0
        -------------------------------------
        SELECT MAX (dmsample0_.ORD) AS x0_0_ FROM HF_DM_SAMPLE dmsample0_ WHERE
        (dmsample0_.PROJECT_ID = '000000000001')

        Plan hash value: 4232005098

        ------------------------------------------------------------------------------------------
        | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
        ------------------------------------------------------------------------------------------
        | 0 | SELECT STATEMENT | | | | 3 (100)| |
        | 1 | SORT AGGREGATE | | 1 | 18 | | |
        | 2 | FIRST ROW | | 1 | 18 | 3 (0)| 00:00:01 |
        |* 3 | INDEX RANGE SCAN (MIN/MAX)| IND_MULTI | 1 | 18 | 3 (0)| 00:00:01 |
        ------------------------------------------------------------------------------------------

        Predicate Information (identified by operation id):
        ---------------------------------------------------

        3 - access("DMSAMPLE0_"."PROJECT_ID"='000000000001')

        這里我們再來看下另一種索引的創建辦法:
        Drop index ind_multi;
        create index ind_multi on HF_DM_SAMPLE(ORD, PROJECT_ID);

        這里我們以ORD為索引的前導列創建索引,然后看執行計劃:
        SQL_ID fbmhd0u1j3t3u, child number 0
        -------------------------------------
        select max(dmsample0_.ORD) as x0_0_ from HF_DM_SAMPLE dmsample0_ where
        (dmsample0_.PROJECT_ID='000000000001' )

        Plan hash value: 1607964330

        -----------------------------------------------------------------------------------------
        | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
        -----------------------------------------------------------------------------------------
        | 0 | SELECT STATEMENT | | | | 2 (100)| |
        | 1 | SORT AGGREGATE | | 1 | 18 | | |
        | 2 | FIRST ROW | | 1 | 18 | 2 (0)| 00:00:01 |
        |* 3 | INDEX FULL SCAN (MIN/MAX)| IND_MULTI | 1 | 18 | 2 (0)| 00:00:01 |
        -----------------------------------------------------------------------------------------

        Predicate Information (identified by operation id):
        ---------------------------------------------------

        3 - filter("DMSAMPLE0_"."PROJECT_ID"='000000000001')

        這里從之前的INDEX RANGE SCAN (MIN/MAX)變為了INDEX FULL SCAN (MIN/MAX),index full scan(MIN/MAX)也是全索引掃描,而跟index range scan(min/max)所不同的是index full scan(min/max)會直接掃描root、分支然后到最左或者最后葉塊節點,當然掃描過程中還會對project_id進行過濾,如果不符合查詢繼續從右邊往前邊掃描葉塊節點,直到找到符合條件的葉塊,index range scan(min/max)會有個先通過索引前導列過濾的行為,然后去掃描對應的葉塊節點的第一個或者最后一個葉塊。

        初始來看,這兩種索引的消耗沒有多大區別,而隨著數據的增多兩種索引掃描還是有一定的差異的,當PROJECT_ID不同值多后,以project_id為前導列的索引IO成本不會有太大的變化,而以ORD為索引的前導列IO成本會增加。

        還有一個需要注意的是,過多的索引會造成更新較多,我們需要根據需求來做出進一步的選擇以哪個為索引前導列來建立索引,就目前這個sql而言,由于project_id字段不同值只有2,而業務的查詢也是使用ORD過濾的較多,這里還是以ORD為前導列建議索引更加合適。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        索引優化min、max的聚合函數

        索引優化min、max的聚合函數:客戶提到最近系統比較慢,采樣了一個awr報表,發現了下面的這個sql語句存執行時間較長 SELECT MAX (dmsample0_.ORD) AS x0_0_ FROM HF_DM_SAMPLE dmsample0_ WHERE (dmsample0_.PROJECT_ID = '000000000001') sele
        推薦度:
        標簽: max 客戶 提到
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲国产精彩中文乱码AV| 亚洲精品97久久中文字幕无码| 亚洲成a人片77777老司机| 青青操视频在线免费观看| 亚洲成色在线综合网站| 一级毛片成人免费看免费不卡| 亚洲国产综合专区在线电影| 一级毛片免费观看| 亚洲啪啪免费视频| 日本高清免费不卡视频| 黄色网址在线免费观看| 亚洲中文久久精品无码| 成人毛片18岁女人毛片免费看| 亚洲国产日韩女人aaaaaa毛片在线| 在线看免费观看AV深夜影院| 国产色在线|亚洲| 国产成人免费a在线资源| 一级毛片免费在线| 亚洲一区二区中文| 成年女人看片免费视频播放器| 国产精品亚洲精品日韩动图| 中文字幕精品无码亚洲字| 国产精品区免费视频| 在线观看亚洲AV每日更新无码| 亚洲成aⅴ人片久青草影院| a毛片全部免费播放| 亚洲精品第一国产综合野| 免费女人18毛片a级毛片视频| 久久国产精品成人免费| 亚洲激情视频图片| 国产91精品一区二区麻豆亚洲| 99xxoo视频在线永久免费观看| 亚洲国产综合精品一区在线播放| 东方aⅴ免费观看久久av| 亚洲人成网男女大片在线播放| 免费国产高清视频| 91久久青青草原线免费| 亚洲av无码片vr一区二区三区| 亚洲国产精品成人精品无码区 | 亚洲av永久无码精品秋霞电影秋| 综合久久久久久中文字幕亚洲国产国产综合一区首 |