欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
通過(guò)建立索引提高數據庫查詢(xún)速度的原理
2008-06-24 15:13
索引是提高數據查詢(xún)最有效的方法,也是最難全面掌握的技術(shù),因為正確的索引可能使效率提高10000倍,而無(wú)效的索引可能是浪費了數據庫空間,甚至大大降低查詢(xún)性能。   
    
      
    
    索引的管理成本   
    
    1、       存儲索引的磁盤(pán)空間   
    
    2、       執行數據修改操作(INSERT、UPDATE、DELETE)產(chǎn)生的索引維護   
    
    3、       在數據處理時(shí)回需額外的回退空間。   
    
      
    
    實(shí)際數據修改測試:   
    
    一個(gè)表有字段A、B、C,同時(shí)進(jìn)行插入10000行記錄測試   
    
    在沒(méi)有建索引時(shí)平均完成時(shí)間是2.9秒   
    
    在對A字段建索引后平均完成時(shí)間是6.7秒   
    
    在對A字段和B字段建索引后平均完成時(shí)間是10.3秒   
    
    在對A字段、B字段和C字段都建索引后平均完成時(shí)間是11.7秒   
    
    從以上測試結果可以明顯看出索引對數據修改產(chǎn)生的影響   
    
      
    
    索引按存儲方法分類(lèi)   
    
    B*樹(shù)索引   
    
    B*樹(shù)索引是最常用的索引,其存儲結構類(lèi)似書(shū)的索引結構,有分支和葉兩種類(lèi)型的存儲數據塊,分支塊相當于書(shū)的大目錄,葉塊相當于索引到的具體的書(shū)頁(yè)。一般索引及唯一約束索引都使用B*樹(shù)索引。   
    
    位圖索引   
    
   位圖索引儲存主要用來(lái)節省空間,減少DB2對數據塊的訪(fǎng)問(wèn),它采用位圖偏移方式來(lái)與表的行ID號對應,采用位圖索引一般是重復值太多的表字段。位圖索引在實(shí)際密集型OLTP(數據事務(wù)處理)中用得比較少,因為OLTP會(huì )對表進(jìn)行大量的刪除、修改、新建操作,ORACLE每次進(jìn)行操作都會(huì )對要操作的數據塊加鎖,所以多人操作很容易產(chǎn)生數據塊鎖等待甚至死鎖現象。在OLAP(數據分析處理)中應用位圖有優(yōu)勢,因為OLAP中大部分是對數據庫的查詢(xún)操作,而且一般采用數據倉庫技術(shù),所以大量數據采用位圖索引節省空間比較明顯。   
    
      
    
    索引按功能分類(lèi)   
    
    唯一索引   
    
    唯一索引有兩個(gè)作用,一個(gè)是數據約束,一個(gè)是數據索引,其中數據約束主要用來(lái)保證數據的完整性,唯一索引產(chǎn)生的索引記錄中每一條記錄都對應一個(gè)唯一的ROWID。   
    
      
    
    主關(guān)鍵字索引   
    
    主關(guān)鍵字索引產(chǎn)生的索引同唯一索引,只不過(guò)它是在數據庫建立主關(guān)鍵字時(shí)系統自動(dòng)建立的。   
    
    一般索引   
    
    一般索引不產(chǎn)生數據約束作用,其功能主要是對字段建立索引表,以提高數據查詢(xún)速度。   
    
      
    
      
    
    索引按索引對象分類(lèi)   
    
      
    
    單列索引(表單個(gè)字段的索引)   
    
    多列索引(表多個(gè)字段的索引)   
    
    函數索引(對字段進(jìn)行函數運算的索引)   
    
    建立函數索引的方法:   
    
    create     index     收費日期索引     on     GC_DFSS(trunc(sk_rq))   
    
    create     index     完全客戶(hù)編號索引     on     yhzl(qc_bh||kh_bh)   
    
    在對函數進(jìn)行了索引后,如果當前會(huì )話(huà)要引用應設置當前會(huì )話(huà)的query_rewrite_enabled為T(mén)RUE。   
    
    alter     session     set     query_rewrite_enabled=true   
    
    注:如果對用戶(hù)函數進(jìn)行索引的話(huà),那用戶(hù)函數應加上     deterministic參數,意思是函數在輸入值固定的情況下返回值也固定。例:   
    
    create     or     replace     function     trunc_add(input_date     date)return     date     deterministic   
    
    as     
    
    begin   
    
            return     trunc(input_date+1);   
    
    end     trunc_add;   
    
      
    
    應用索引的掃描分類(lèi)   
    
    INDEX     UNIQUE     SCAN(按索引唯一值掃描)   
    
    select     *     from     zl_yhjbqk     where     hbs_bh='5420016000'   
    
    INDEX     RANGE     SCAN(按索引值范圍掃描)   
    
    select     *     from     zl_yhjbqk     where     hbs_bh>'5420016000'   
    
    select     *     from     zl_yhjbqk     where     qc_bh>'7001'   
    
    INDEX     FAST     FULL     SCAN(按索引值快速全部掃描)   
    
    select     hbs_bh     from     zl_yhjbqk     order     by     hbs_bh   
    
    select     count(*)     from     zl_yhjbqk   
    
    select     qc_bh     from     zl_yhjbqk     group     by     qc_bh   
    
      
    
    什么情況下應該建立索引   
    
    表的主關(guān)鍵字   
    
    自動(dòng)建立唯一索引   
    
    如zl_yhjbqk(用戶(hù)基本情況)中的hbs_bh(戶(hù)標識編號)   
    
    表的字段唯一約束   
    
    ORACLE利用索引來(lái)保證數據的完整性   
    
    如lc_hj(流程環(huán)節)中的lc_bh+hj_sx(流程編號+環(huán)節順序)   
    
    直接條件查詢(xún)的字段   
    
    在SQL中用于條件約束的字段   
    
    如zl_yhjbqk(用戶(hù)基本情況)中的qc_bh(區冊編號)   
    
    select     *     from     zl_yhjbqk     where     qc_bh=’7001’   
    
    查詢(xún)中與其它表關(guān)聯(lián)的字段   
    
    字段常常建立了外鍵關(guān)系   
    
    如zl_ydcf(用電成份)中的jldb_bh(計量點(diǎn)表編號)   
    
    select     *     from     zl_ydcf     a,zl_yhdb     b    where     a.jldb_bh=b.jldb_bh     and     b.jldb_bh=’540100214511’   
    
      
    
    查詢(xún)中排序的字段   
    
    排序的字段如果通過(guò)索引去訪(fǎng)問(wèn)那將大大提高排序速度   
    
    select     *     from     zl_yhjbqk     order     by     qc_bh(建立qc_bh索引)   
    
    select     *     from     zl_yhjbqk     where    qc_bh='7001'     order     by    cb_sx(建立qc_bh+cb_sx索引,注:只是一個(gè)索引,其中包括qc_bh和cb_sx字段)   
    
    查詢(xún)中統計或分組統計的字段   
    
    select     max(hbs_bh)     from     zl_yhjbqk   
    
    select     qc_bh,count(*)     from     zl_yhjbqk     group     by     qc_bh   
    
      
    
    什么情況下應不建或少建索引   
    
    表記錄太少   
    
   如果一個(gè)表只有5條記錄,采用索引去訪(fǎng)問(wèn)記錄的話(huà),那首先需訪(fǎng)問(wèn)索引表,再通過(guò)索引表訪(fǎng)問(wèn)數據表,一般索引表與數據表不在同一個(gè)數據塊,這種情況下ORACLE至少要往返讀取數據塊兩次。而不用索引的情況下ORACLE會(huì )將所有的數據一次讀出,處理速度顯然會(huì )比用索引快。   
    
    如表zl_sybm(使用部門(mén))一般只有幾條記錄,除了主關(guān)鍵字外對任何一個(gè)字段建索引都不會(huì )產(chǎn)生性能優(yōu)化,實(shí)際上如果對這個(gè)表進(jìn)行了統計分析后ORACLE也不會(huì )用你建的索引,而是自動(dòng)執行全表訪(fǎng)問(wèn)。如:   
    
    select     *     from     zl_sybm     where     sydw_bh='5401'(對sydw_bh建立索引不會(huì )產(chǎn)生性能優(yōu)化)   
    
      
    
    經(jīng)常插入、刪除、修改的表   
    
    對一些經(jīng)常處理的業(yè)務(wù)表應在查詢(xún)允許的情況下盡量減少索引,如zl_yhbm,gc_dfss,gc_dfys,gc_fpdy等業(yè)務(wù)表。   
    
      
    
    數據重復且分布平均的表字段   
    
    假如一個(gè)表有10萬(wàn)行記錄,有一個(gè)字段A只有T和F兩種值,且每個(gè)值的分布概率大約為50%,那么對這種表A字段建索引一般不會(huì )提高數據庫的查詢(xún)速度。   
    
      
    
    經(jīng)常和主字段一塊查詢(xún)但主字段索引值比較多的表字段   
    
   如gc_dfss(電費實(shí)收)表經(jīng)常按收費序號、戶(hù)標識編號、抄表日期、電費發(fā)生年月、操作標志來(lái)具體查詢(xún)某一筆收款的情況,如果將所有的字段都建在一個(gè)索引里那將會(huì )增加數據的修改、插入、刪除時(shí)間,從實(shí)際上分析一筆收款如果按收費序號索引就已經(jīng)將記錄減少到只有幾條,如果再按后面的幾個(gè)字段索引查詢(xún)將對性能不產(chǎn)生太大的影響。   
    
      
    
    如何只通過(guò)索引返回結果   
    
    一個(gè)索引一般包括單個(gè)或多個(gè)字段,如果能不訪(fǎng)問(wèn)表直接應用索引就返回結果那將大大提高數據庫查詢(xún)的性能。對比以下三個(gè)SQL,其中對表zl_yhjbqk的hbs_bh和qc_bh字段建立了索引:   
    
    1     select     hbs_bh,qc_bh,xh_bz     from     zl_yhjbqk     where     qc_bh=’7001’   
    
      
    
      
    
    執行路徑:   
    
    SELECT     STATEMENT,     GOAL     =     CHOOSE                     11       265     5565   
    
      TABLE     ACCESS     BY     INDEX     ROWID           DLYX           ZL_YHJBQK         11       265     5565   
    
        INDEX     RANGE     SCAN       DLYX           區冊索引           1         265     
    
    平均執行時(shí)間(0.078秒)   
    
    2     select     hbs_bh,qc_bh     from     zl_yhjbqk     where     qc_bh=’7001’   
    
    執行路徑:   
    
    SELECT     STATEMENT,     GOAL     =     CHOOSE                     11       265     3710   
    
      TABLE     ACCESS     BY     INDEX     ROWID           DLYX           ZL_YHJBQK         11       265     3710   
    
        INDEX     RANGE     SCAN       DLYX           區冊索引           1         265     
    
    平均執行時(shí)間(0.078秒)   
    
    3     select     qc_bh     from     zl_yhjbqk     where     qc_bh=’7001’   
    
    執行路徑:   
    
    SELECT     STATEMENT,     GOAL     =     CHOOSE                     1         265     1060   
    
      INDEX     RANGE     SCAN         DLYX           區冊索引           1         265     1060   
    
    平均執行時(shí)間(0.062秒)   
    
      
    
    從執行結果可以看出第三條SQL的效率最高。執行路徑可以看出第1、2條SQL都多執行了TABLE     ACCESS    BY     INDEX     ROWID(通過(guò)ROWID訪(fǎng)問(wèn)表)    這個(gè)步驟,因為返回的結果列中包括當前使用索引(qc_bh)中未索引的列(hbs_bh,xh_bz),而第3條SQL直接通過(guò)QC_BH返回了結果,這就是通過(guò)索引直接返回結果的方法。   
    
      
    
    如何重建索引   
    
    alter     index     表電量結果表主鍵     rebuild   
    
      
    
    如何快速新建大數據量表的索引   
    
   如果一個(gè)表的記錄達到100萬(wàn)以上的話(huà),要對其中一個(gè)字段建索引可能要花很長(cháng)的時(shí)間,甚至導致服務(wù)器數據庫死機,因為在建索引的時(shí)候ORACLE要將索引字段所有的內容取出并進(jìn)行全面排序,數據量大的話(huà)可能導致服務(wù)器排序內存不足而引用磁盤(pán)交換空間進(jìn)行,這將嚴重影響服務(wù)器數據庫的工作。解決方法是增大數據庫啟動(dòng)初始化中的排序內存參數,如果要進(jìn)行大量的索引修改可以設置10M以上的排序內存(ORACLE缺省大小為64K),在索引建立完成后應將參數修改回來(lái),因為在實(shí)際OLTP數據庫應用中一般不會(huì )用到這么大的排序內存。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
MySQL索引的查看創(chuàng )建和刪除
【收藏】SQL語(yǔ)句優(yōu)化技術(shù)分析
數據庫優(yōu)化
讓SQL程序更快的運行:語(yǔ)句優(yōu)化分析(2)
數據庫、數據表建立索引的原則
索引失效的7種情況
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久