• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            大龍的博客

            常用鏈接

            統(tǒng)計

            最新評論

            提高數(shù)據(jù)更新效率(UPDATE/INSERT) --- 轉(zhuǎn)

            有多種方法可以提高更新的效率.
            簡單說來:
            1、暫停索引,更新后恢復(fù).避免在更新的過程中涉及到索引的重建.
            2、批量更新,每更新一些記錄后及時進(jìn)行提交動作.避免大量占用回滾段和或臨時表空間.
            3、創(chuàng)建一臨時的大的表空間用來應(yīng)對這些更新動作.
            =========================================================================不同看法
            如果UPDATE的是索引字段,就會涉及到索引的重建,暫停索引不會提高多少的速度,反而有可能降低UPDATE速度,
            因為在更新是索引可以提高數(shù)據(jù)的查詢速度,重建索引引起的速度降低影響不大。

            ORACLE優(yōu)化修改參數(shù)最多也只能把性能提高15%,大部分都是SQL語句的優(yōu)化!


            =========================================================================不同位置
            update總體來說比insert要慢  
            幾點建議:  
              1、如果更新的數(shù)據(jù)量接近整個表,就不應(yīng)該使用index而應(yīng)該采用全表掃描  
              2、減少不必要的index,因為update表通常需要update index  
              3、如果你的服務(wù)器有多個cpu,采用parellel hint,可以大幅度的提高效率  
               
              前年我也遇到類似的問題,300萬紀(jì)錄的一個表,每天要全表更新20次左右,最初通過cursor多進(jìn)程(18個進(jìn)程)更新,耗時30分鐘,
              后來采用full+parallel   hint,耗時降低到3分鐘左右。服務(wù)器是ibm   rs6000   s590,18個CPU,64GB內(nèi)存。  
             
              另外,建表的參數(shù)非常重要,對于更新非常頻繁的表,建議加大PCTFREE的值,以保證數(shù)據(jù)塊中有足夠的空間用于UPDATE,
              從而降低CHAINED_ROWS。 


            =========================================================================不同位置
            如果有足夠CPU以及I/O 的話....
            ALTER SESSION ENABLE PARALLEL DML;

            INSERT /*+ PARALLEL(tableA, 2) */
            INTO tableA NOLOGGING
            SELECT * FROM tableB;

            當(dāng)中的 2 是多少個進(jìn)程同時執(zhí)行. 可應(yīng)不同情況加減. 


            =========================================================================不同位置
            2比較可行的方法
            方法一:使用oracle中包含在注釋中的提示信息
            insert /*+append*/ into ...nologing
            select * from ...

            方法二:使用批量拷貝方法
            set arraysize 20
            set copycommit 5000
            copy fromusername/password@oracle_nameappend table_name1
            using select * from table_name2;

            實際效果,方法一要比方法二速度還要快些

            /*+append */ nologging 的方法不錯.
            bulk insert好像需要內(nèi)容足夠大才可以.

            =========================================================================不同位置
            set autocommit 100;----------每一百條記錄提交一次
            set transaction use rollback segment RBS1;
                  INSERT INTO table1 NOLOGGING
                     SELECT * FROM table2;
                 commit;

            改變表的存儲策略:
            ALTER TABLE aaaa1
                PCTFREE 30
                PCTUSED 60;
            ---------這兩個值相加要小于100,把PCTFREE搞大,PCTUSED搞小,可能會快一點

            =========================================================================不同位置
            再提供一種方法,俺曾經(jīng)用過的:
            alter session set sort_area_size=100000000;
            insert into tableb select * from tablea;
            commit;


            =========================================================================總結(jié)
            提高更新速度總結(jié):
            1、暫停索引,更新后恢復(fù).避免在更新的過程中涉及到索引的重建.
                缺點:
                    如果UPDATE的是索引字段,就會涉及到索引的重建,暫停索引不會提高多少的速度,反而有可能降低UPDATE速度。
                    如果表比較龐大,停索引后重鍵需要花比較長的時間
                優(yōu)點:
                    如果更新的數(shù)據(jù)量接近整個表,此方法比較好。
                   
            2、批量更新,每更新一些記錄后及時進(jìn)行提交動作.避免大量占用回滾段和或臨時表空間.
            3、創(chuàng)建一臨時的大的表空間用來應(yīng)對這些更新動作.
            4、如果你的服務(wù)器有多個cpu,采用parellel hint,可以大幅度的提高效率
                ALTER SESSION ENABLE PARALLEL DML;

                INSERT /*+ PARALLEL(tableA, 2) */INTO tableA NOLOGGING
                   SELECT * FROM tableB;
                當(dāng)中的 2 是多少個進(jìn)程同時執(zhí)行. 可應(yīng)不同情況加減. 

            5、建表的參數(shù)非常重要,對于更新非常頻繁的表,建議加大PCTFREE的值,以保證數(shù)據(jù)塊中有足夠的空間用于UPDATE,從而降低CHAINED_ROWS
                ALTER TABLE aaaa1
                   PCTFREE 30
                   PCTUSED 60;
                ---------這兩個值相加要小于100,把PCTFREE搞大,PCTUSED搞小,可能會快一點

            6、oracle提示及批量拷貝
                方法一:使用oracle中包含在注釋中的提示信息
                    insert /*+append*/ into ...nologing
                       select * from ...

                方法二:使用批量拷貝方法
                    set arraysize 20
                    set copycommit 5000
                    copy fromusername/password@oracle_nameappend table_name1
                    using select * from table_name2;

                實際效果,方法一要比方法二速度還要快些

            7、加大排序緩沖區(qū)
                alter session set sort_area_size=100000000;
                insert into tableb select * from tablea;
                commit;

            posted on 2013-12-04 11:39 大龍 閱讀(727) 評論(0)  編輯 收藏 引用


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            亚洲精品国产第一综合99久久 | 国产精品成人久久久| 久久精品亚洲AV久久久无码| 国产精品久久网| 欧美日韩精品久久免费| 九九久久自然熟的香蕉图片| 欧美激情精品久久久久久久 | 久久影视综合亚洲| 国产午夜免费高清久久影院| 久久国产影院| 久久久久久久综合日本亚洲| 大香伊人久久精品一区二区| 久久久精品午夜免费不卡| 无码人妻久久一区二区三区蜜桃 | 一本久久a久久精品vr综合| 久久久免费观成人影院 | 久久天天日天天操综合伊人av| 久久久精品国产sm调教网站| 亚洲va久久久久| 久久精品国产99久久久香蕉| 久久综合狠狠色综合伊人| 久久婷婷五月综合国产尤物app| 国产午夜精品久久久久九九| 久久精品国产亚洲AV电影 | 色成年激情久久综合| 精品久久久噜噜噜久久久 | 国产情侣久久久久aⅴ免费| 久久人人爽人人爽人人片AV东京热| 久久久久香蕉视频| 国产激情久久久久影院小草| 亚洲成人精品久久| 99久久精品免费国产大片| 久久精品国产亚洲欧美| www.久久精品| 国产精品久久久久久久久久免费| 久久精品人人做人人爽电影| 国产精品久久久久影院色| 国产69精品久久久久777| 精品久久久久久久| 狠狠色综合网站久久久久久久| 国产精品va久久久久久久|