1. 程式人生 > >關於大資料批量更新的問題(高效能)

關於大資料批量更新的問題(高效能)

當你批量操作資料的時候,常常會使用到update table1 from table2)的這種方式。這種方式是最簡潔的。

但當你從excel或者CSV檔案更新海量資料時,再使用這種方法,那效能是不是好,字串拼接又何其之多,大資料是不是需要分組更新?

我不想去檢測各種方法的速度,因為我個人比較認可以下方式,歡迎大家批評與指正。

我需要使用到的類主要是SqlCommandBuilder。

/// <param name="table">準備更新的DataTable新資料</param>
    /// <param name="TableName">對應要更新的資料庫表名</param>
    /// <param name="primaryKeyName">對應要更新的資料庫表的主鍵名</param>
    /// <param name="columnsName">對應要更新的列的列名集合</param>
    /// <param name="limitColumns">需要在SQL的WHERE條件中限定的條件字串,可為空。</param>
    /// <param name="onceUpdateNumber">每次往返處理的行數</param>
    /// <returns>返回更新的行數</returns>
    public static int Update(DataTable table, string TableName, string primaryKeyName, string[] columnsName, string limitWhere,int onceUpdateNumber)
    {
        if (string.IsNullOrEmpty(TableName)) return 0;
        if (string.IsNullOrEmpty(primaryKeyName)) return 0;
        if (columnsName == null || columnsName.Length <= 0) return 0;
        DataSet ds = new DataSet();
        ds.Tables.Add(table);
        int result = 0;
        using (SqlConnection sqlconn = new SqlConnection(SqlHelper.ConnString))
        {
            sqlconn.Open();

            //使用加強讀寫鎖事務   
            SqlTransaction tran = sqlconn.BeginTransaction(IsolationLevel.ReadCommitted);
            try
            {
                foreach (DataRow dr in ds.Tables[0].Rows)
                {
                    //所有行設為修改狀態   
                    dr.SetModified();
                }
                //為Adapter定位目標表   
                SqlCommand cmd = new SqlCommand(string.Format("select * from {0} where {1}", TableName,limitWhere), sqlconn, tran);
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                SqlCommandBuilder sqlCmdBuilder = new SqlCommandBuilder(da);
                da.AcceptChangesDuringUpdate = false;
                string columnsUpdateSql = "";
                SqlParameter[] paras = new SqlParameter[columnsName.Length];
                //需要更新的列設定引數是,引數名為"@+列名"
                for (int i = 0; i < columnsName.Length; i++)
                {
                    //此處拼接要更新的列名及其引數值
                    columnsUpdateSql += ("[" + columnsName[i] + "]" + "
[email protected]
" + columnsName[i] + ","); paras[i] = new SqlParameter("@" + columnsName[i], columnsName[i]); } if (!string.IsNullOrEmpty(columnsUpdateSql)) { //此處去掉拼接處最後一個"," columnsUpdateSql = columnsUpdateSql.Remove(columnsUpdateSql.Length - 1); } //此處生成where條件語句 string limitSql = ("[" + primaryKeyName + "]" + "
[email protected]
" + primaryKeyName); SqlCommand updateCmd = new SqlCommand(string.Format(" UPDATE [{0}] SET {1} WHERE {2} ", TableName, columnsUpdateSql, limitSql)); //不修改源DataTable updateCmd.UpdatedRowSource = UpdateRowSource.None; da.UpdateCommand = updateCmd; da.UpdateCommand.Parameters.AddRange(paras); da.UpdateCommand.Parameters.Add("@" + primaryKeyName, primaryKeyName); //每次往返處理的行數 da.UpdateBatchSize = onceUpdateNumber; result = da.Update(ds,TableName); ds.AcceptChanges(); tran.Commit(); } catch { tran.Rollback(); } finally { sqlconn.Dispose(); sqlconn.Close(); } } return result; }


注:
此方法呼叫時要傳入的引數,包括主鍵名和列名都應與資料庫實際的名稱相對應.

你可以不傳入限定的where條件,如果傳入,只需傳入:Name="chamy" or Name="jundy",不需加入“where”等字元,不可以在此處傳入主鍵的限定。你只需要在主鍵名這個引數上傳入名稱即可。


更多WEB開發技術請加群:Asp.Net高階群 號碼:261882616

博主以及同事和你共同探討感興趣的話題。


相關推薦

關於資料批量更新的問題(高效能)

當你批量操作資料的時候,常常會使用到update table1 from table2)的這種方式。這種方式是最簡潔的。 但當你從excel或者CSV檔案更新海量資料時,再使用這種方法,那效能是不是好,字串拼接又何其之多,大資料是不是需要分組更新? 我不想去檢測各種方法的速

thinkphp對180萬資料批量更新支援事務回滾

目前測試180萬多的資料,大概是正常的,不知道再多了會怎麼樣了我們要給表改成 innodb型別 乾貨來了:        set_time_limit(0);         

解決不能將DataTable資料批量更新到資料庫的問題

問題描述:從excel檔案使用OLEDB方式讀取資料到DataTable中,然後將DataTable資料更新到access資料庫,這時由於DataTable中的每一行的RowStated狀態都是unChanged而無法通過UpdateCommand方式更新到資料庫。 解決方法:將從excel檔案

【Oracle批量更新】根據一個批量更新另一大表的方法比較

【問題】現在有兩個千萬級別的結構相同資料不同資料表T_SMS_PHONENO(目的表),T_SMS_PHONENO2(源表),根據源表資料更新目的表的資料。 【分析】根據經驗,更新方法一般有以下幾種: 1、直接update。 update T_SMS_PHONENO T Se

C# 幾種資料庫的資料批量插入 C# 幾種資料庫的資料批量插入

C# 幾種資料庫的大資料批量插入   轉載:http://www.cnblogs.com/luluping/archive/2012/08/09/2629515.html 在之前只知道SqlServer支援資料批量插入,殊不知道Oracle、SQLite和MySql也是

C#資料批量增加到資料庫

程式碼如下: static void WriteToDatabase(DataTable dt) { string connString = "Data So

資料-批量資料處理方式

1.從oracle到hdfs sqoop import --connect jdbc:oracle:thin:@192.168.0.111:1521:orcl --username user1 --pa

Oracle資料庫學習小結(三)---資料批量插入bulkcopy

    上篇文章中說到要跟大家聊聊bulkcopy這個的用法,今天我們就來了解一下這個用法。在之前我們寫程式的時候如果遇到需要往資料庫中插入資料你會怎麼辦?可能第一反應是加個迴圈一條一條插入唄,如果我

C#讀取Txt資料更新到資料庫

環境    Sqlserver 2016    .net 4.5.2   目前測試資料1300萬 大約3-4分鐘.(限制一次讀取條數 和 執行緒數是 要節省伺服器資源,如果調太大伺服器其它應用可能就跑不了了), SqlS

Sentry(v20.12.1) K8S 雲原生架構探索,玩轉前/後端監控與事件日誌資料分析,高效能+高可用+可擴充套件+可伸縮叢集部署

![](https://img2020.cnblogs.com/blog/436453/202101/436453-20210110115844475-876798893.png) `Sentry` 算是目前開源界集錯誤監控,日誌打點上報,事件資料實時分析最好用的軟體了,沒有之一。將它部署到 `Kuber

如何解決本地批量資料更新,和後臺的同步,講解socket的IPC和socket的通訊

說這個問題首先我先說下這個業務的使用場景。隨著網際網路的發展進入了下半場,有以前的app大而且多的局面滿滿的走向精而細的劃分,每一個app的如何基於大資料統計使用者行為是衡量一款產品的優劣標準之一,因為這些資料驅動老闆、產品、市場、運營的業務決策,深度瞭解你的使用者行為,評估

ADO.NET批量更新資料

ADO.NET大批量進行資料更新  public static void SqlBulkUpdate() { DataTable dt = ExcelHelper.ImportExcelFile("d://User1.xls"); //將Excel中的資料匯入到

Sql Server資料庫使用觸發器和sqlbulkcopy批量資料插入更新

需要了解的知識 1.觸發器 2.sqlbulkcopy 我的用途 開發資料庫同步的工具,需要大批量資料插入和資料更新。 方式 使用SqlBulkCopy類對資料進行資料批量複製,將需要同步資料的表新建一個結構相同的臨時表。然後在臨時表編寫觸發器用於對更新資料的表進行資料插入

SQL之merge into 批量更新資料

    轉載:http://www.cnblogs.com/ruiati/archive/2013/01/18/2866017.html Merge關鍵字是一個神奇的DML關鍵字。它在SQL Server 2008被引入,它能將Insert,Update,Dele

SQL之merge into 批量更新資料 Merge關鍵字是一個神奇的DML關鍵字。它在SQL Server 2008被引入,它能將Insert,Update,Delete簡單的併為一句。M

轉載http://www.cnblogs.com/ruiati/archive/2013/01/18/2866017.html     Merge關鍵字是一個神奇的DML關鍵字。它在SQL Server 2008被引入,它能將Insert,Up

批量更新程式碼整理(程式碼庫)從陣列中批量資料的方法

查詢出所有的資料,分批插入。從原來的所有的list 資料裡面,每次拿出X 條資料,再批量更新 public void insertStudent() { List<Student> list = studentDao.listAllStudentForStat(); i

【異常帖】--- 資料出現的所有異常,錯誤,和注意事項整理---持續更新.....

一、Ubuntu --> 修改主機名稱之後,要特別主要修改主機和ip的對映(否則會造成java.net.UnknownHostException: 主機名: 主機名的異常,mkdir: Call From java.net.UnknownHostException: s100: s100: u

MySQL中使用replace into語句批量更新資料

作為示例,我們在這裡使用名為testdb的資料庫,並且在其中建立兩張一模一樣的表: drop table if exists test_table_1; create table test_table_1 ( name varchar(30) primary key, age integer

【PHP+MYSQL】批量插入時表中有相同資料的話則批量更新

應用場景 有時候我們向資料庫插入記錄時,有時會有這種需求,當符合某種條件的資料存在時,去修改它,不存在時,則新增資料的情況。 比如說系統配置則一塊,如有下表: CREATE TABLE `system_config` ( `id` int(11) unsigned NOT N

資料每日默寫(面試題)整理(持續更新

2018.10.22 1.抽象類與介面的區別? 1.語法層面上的區別   1)抽象類可以提供成員方法的實現細節,而介面中只能存在public abstract 方法;   2)抽象類中的成員變數可以是各種型別的,而介面中的成員變數只能是public static final型別的;   3)