扒开腿挺进岳湿润的花苞视频|将军边走边挺进她H树林|挺进朋友人妻张婉莹身体|岳脱得精光让我挺进去视频|第一次挺进莹莹的身体里视频|脱岳裙子从后面挺进去视频

新疆軟件開發(fā)

本站首頁 軟件開發(fā) 成功案例 公司新聞 公司簡介 客服中心 軟件技術 網站建設
  您現(xiàn)在的位置: 新疆二域軟件開發(fā)公司 >> .Net技術 >> 文章正文

ADO.Net中如何優(yōu)化Oracle大批量數(shù)據(jù)更新時的性能

            在日常的業(yè)務系統(tǒng)應用中,大家經常會使用到大量數(shù)據(jù)的的提交(包括查詢、更新或刪除),假如目標數(shù)據(jù)庫的數(shù)據(jù)量較大,一次需要處理的操作較多,就會出現(xiàn)系統(tǒng)執(zhí)行效率低下等問題。文本中筆者以Oracle9i數(shù)據(jù)庫為例,通過對ADO.Net中的數(shù)據(jù)庫支持的應用實踐,說明幾種常見的優(yōu)化處理方法,并對比其中的優(yōu)劣。
           為了更詳細說明情況,筆者以某業(yè)務數(shù)據(jù)填報功能為例,假設有100個用戶每周需要填報某統(tǒng)計數(shù)量,填報明細的數(shù)據(jù)量約為200條,有專門的填報頁面實現(xiàn)一次提交,這樣一周的數(shù)據(jù)增量約為2萬,一年為100多萬,要保證系統(tǒng)有效運行6年以上,需要考慮數(shù)據(jù)存儲(增、刪、改)效率問題,(數(shù)據(jù)庫本身的優(yōu)化配置,包括表空間、索引等查詢效率已經考慮,不在此討論范疇)。這類業(yè)務的特點是,數(shù)據(jù)操作量較大,但執(zhí)行的指令復雜度較低,包含簡單的新增、修改、刪除3類。
傳統(tǒng)處理方法存在的問題
        對每一個要處理的操作,直接對目標表執(zhí)行對應的SQL操作(或存儲過程),可使用ADO.Net的參數(shù)化SQL或通過DataSet與DataAdapter來間接處理。這樣每個用戶批量提交數(shù)據(jù)時,需要執(zhí)行大約200次SQL操作,雖然數(shù)據(jù)庫進行了優(yōu)化,單次執(zhí)行SQL的效率并不低,但由于一次執(zhí)行的指令較多,隨著目標數(shù)據(jù)容量的增加,效率會逐步降低,最終不可忍受。
優(yōu)化方法1:臨時表處理模式
               對于大規(guī)模的目標數(shù)據(jù)庫表,進行多次修改、刪除或更新操作,效率必定較慢,要降低對目標表的操作次數(shù),可以采用臨時表的解決辦法。具體方法為:建立一個與目標表結構類似的臨時表(由于B/S模式的特點,臨時表是基于事務的,而不是基于連接的),并增加操作模式標記字段,在執(zhí)行操作前,將本次要操作的數(shù)據(jù),就是某個用戶,每周的數(shù)據(jù)(約200條左右,第一次處理時應該沒有數(shù)據(jù))一次查詢轉入臨時表,再對臨時表執(zhí)行修改、更新、刪除(作刪除標記)操作,處理完畢后,分別將臨時表的數(shù)據(jù)分三類提交到目標表。流程如下圖所示:
刪除
Delete From TARGET_TABLE Where KEY In(Select KEY
From  TEMP_TABLE Where STATE=‘Delete’
新增
Insert Into TARGET_TABLE …
Select …  From TEMP_TABLE Where STATE=‘Insert’
修改
Update TARGET_TABLE Set …
Where KEY=TEMP_TABLE.KET AND  TEMP_TABLE.STATE=‘Update’
實驗證明,在50萬數(shù)據(jù)量的條件下,此方法能比傳統(tǒng)的方法快40倍左右,且執(zhí)行效率受目標數(shù)據(jù)庫容量的影響較小。
優(yōu)化方法2:使用SQL批處理

SQL批處理一般有2種模式:一種是將要執(zhí)行的SQL語句,連接形成批處理指令,一次提交到服務器執(zhí)行;一種是對執(zhí)行的SQL指令,傳遞多組參數(shù),批執(zhí)行。這兩種方法都需要數(shù)據(jù)庫及ADO.Net的支持。
System.Data.OracleClient 的ADO.Net 2.0版本支持第一種方式的的批處理,如通過DataAdapter對DataSet的批量數(shù)據(jù)提交時,系統(tǒng)會根據(jù)數(shù)據(jù)集合中的新增,修改,刪除標識,構造批處理指令,形成SQL指令段,提交服務器執(zhí)行。這種方式是將多個SQL指令形成一組SQL指令的方法,實現(xiàn)多個指令的批執(zhí)行,能一定程度提高功能的執(zhí)行效率。原理如下所示:
Begin

Insert Into TAREGT_TABLE(A,B,C) Values(:1,:2,:3);

Insert Into TAREGT_TABLE(A,B,C) Values(:4,:5,:6);

Insert Into TAREGT_TABLE(A,B,C) Values(:7,:8,:9);

……

Insert Into TAREGT_TABLE(A,B,C) Values(:n,:n+1,:n+2);

end;

此方法形成的批處理SQL指令及參數(shù)會隨著數(shù)據(jù)量的增加而成倍增加,數(shù)據(jù)更新量與執(zhí)行效率受到限制。而微軟的Oracle ADO.Net實現(xiàn)并沒有將批處理方法直接對外公開,只能通過DataSet的數(shù)據(jù)批量更新間接使用。

另一種處理方法是使用Oracle的ADO.Net實現(xiàn)。Oracle.DataAccess.Client實現(xiàn)的ADO.Net支持第二種模式的批處理指令,其利用Oracle數(shù)據(jù)庫自帶的批處理功能,通過設定OracleCommand的ArrayBindCount來實現(xiàn)對參數(shù)數(shù)組的傳遞。當ArrayBindCount設置為大于1時,傳遞給一個OracleCommand的參數(shù)不再是參數(shù)值,而是參數(shù)數(shù)組,這樣,一條Command指令就可以執(zhí)行多個處理,如:插入100條數(shù)據(jù)。使用這種方法,利用了數(shù)據(jù)庫本身對批量數(shù)據(jù)操作的優(yōu)化機制,極大提高了數(shù)據(jù)操作效率。通過對目標數(shù)據(jù)庫容量為50萬的目標表測試發(fā)現(xiàn),此方法執(zhí)行比傳統(tǒng)方法的執(zhí)行效率提高50倍以上,在測試過程中發(fā)現(xiàn),100萬的目標數(shù)據(jù)量的情況下,一次插入1萬條數(shù)據(jù),只需要1秒左右,且操作效率受目標數(shù)據(jù)量的影響較小。

作者:未知 | 文章來源:網絡 | 更新時間:2008-1-21 16:27:13

  • 上一篇文章:

  • 下一篇文章:

  • 相關文章:
    oracle不能連接本地庫的解決方案
    數(shù)據(jù)庫學習:Oracle應用程序性能優(yōu)化
    Oracle 10g同字節(jié)序跨平臺數(shù)據(jù)遷移的測試
    ORACLE中的日志值轉換成time_t
    如何利用sp_addlinkersrvlogin從oracle查詢數(shù)據(jù)
    學習Oracle10gRelease2新功能之RefCursor
    數(shù)據(jù)學習:Oracle數(shù)據(jù)庫備份方法之熱備份
    如何獲取Oracle當前數(shù)據(jù)庫SCN值
    Oracle數(shù)據(jù)庫幾個常見問題如何解決?
    SQL-Server訪問類與ORACLE訪問類之間的轉換
    軟件技術
    · 開發(fā)語言
    · Java技術
    · .Net技術
    · 數(shù)據(jù)庫開發(fā)
    最新文章  
    ·.net技術 asp.net MVC3 Vi
    ·.net將視頻文件格式轉換成
    ·NET Framework 2.0 Servic
    ·如何動態(tài)修改winform的app
    ·asp,net軟件結構設計和相關
    ·學習怎樣使用ASP.NET中的虛
    ·,net基礎類的學習:system
    ·.net學習:c#事件的深入分
    ·Facade Pattern學習總結
    ·C#如何設置或者獲取目錄的
    ·如何使用XSL來定義ASP.NET
    ·理解WCF Data Contract契約
    ·如何能在.net2.0開發(fā)的控件
    ·模式怎樣使用,講解模式的
    ·如何解決Menu菜單被frame遮
    關于我們 | 軟件開發(fā) | 下載試用 | 客服中心 | 聯(lián)系我們 | 友情鏈接 | 網站地圖 | 新疆電子地圖 | RSS訂閱
    版權所有 © 2016 新疆二域軟件開發(fā)網 m.jdtbank.com All Rights Reserved 新ICP備14003571號
    新疆軟件開發(fā)總機:0991-4842803、4811639.
    客服QQ:596589785 ;地址:新疆烏魯木齊北京中路華聯(lián)大廈A-5C 郵編:830000
     
    肥东县| 北碚区| 湘乡市| 运城市| 太湖县| 宁德市| 乃东县| 饶阳县| 资溪县| 高尔夫| 六安市| 诸暨市| 通化县| 云南省| 开江县| 威信县| 靖西县| 江津市| 永德县| 鸡东县| 东阳市| 晋城| 黔西县| 曲靖市| 偃师市| 浠水县| 顺平县| 丘北县| 上栗县| 大埔区| 浠水县| 陕西省| 固阳县| 镇平县| 钟山县| 富平县| 许昌市| 临朐县| 望城县| 咸宁市| 衢州市|