大數據批量導入校驗方案
Ⅰ Oracle資料庫中,在一定的范圍內如何大批量較快或者較好的方法去校驗表中欄位值得准確性,
如果單純校驗數據抄正襲確性,只要知道邏輯或者取值范圍,是可以select出來的。
但是發現錯誤數據後的修改數據比較復雜,需要獲取到正確的數據,有時候可以通過邏輯推算,有時候就得一條條人工核對了,修改過程還有引入其他錯誤數據風險。
所以,應該通過一些機制在數據插入到資料庫前先校驗內容的正確性,確保插入的數據時clean的,盡量避免事後批量修改。
Ⅱ java 中 ,把大批量數據導入Excel 2003 的優秀解決方案有那些
POI 多線程
Ⅲ 如何向Oracle資料庫表中進行大數據量的插入並提交
一次折騰幾千萬的話, 那麼設置一下, 有 20W了, 就自動提交一下。
set autocommit on;
set autocommit 200000;
然後,假如你的目標資料庫, 是歸檔的話, 可以
INSERT /*+ append */ INTO 目標表 nologging SELECT * FROM 源表@DBLINK;
commit;
set autocommit off;
假如你的 目標表 上面, 有 索引的話, 建議先刪除 索引。
等 上面的 INSERT 語句執行完畢後, 再重建索引。
Ⅳ Excel VBA 大數據量校驗
用Excel來管理這些數據確實費勁了些,而且效率不高。
如果你的數據比較規范的的話可以在VBA中ADO+SQL來提取和處理數據,要比直接讀取單元格方便的多,而且很高效。最好給幾個數據測試一下。
SQL語句要根據你數據的規則來寫,沒法給你舉例子。
下面是我用到過的一段主要代碼你可以參考一下。
Dim Cnn As New ADODB.Connection
Dim rs As ADODB.Recordset
Dim Sql As String, i As Long
Cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" & ThisWorkbook.FullName
Sql = "SELECT distinct sample_number,sampled_date,a_point_desc,a_batch,sin_spec "
Sql = Sql & "FROM [Sheet1$] "
Sql = Sql & "where proct = '" & Proct & "' "
Sql = Sql & "and proct_grade = '" & Grade & "' "
Sql = Sql & "ORDER BY sample_number ASC "
'debug.Print Sql
Set rs = Cnn.Execute(Sql)
Sheets("報表").[A1].CopyFromRecordset rs
rs.Close
Cnn.Close
Ⅳ 如何實現批量提交數據,並且頁面上對數據進行校驗
可能是你得對象太多了,或者看下邊上的滾動條是不是很小.很小代表非常多數據.參考下文. 除了工作簿本身有宏病毒外,以下幾種原因也可能導致工作簿異常膨脹
1、工作表中的格式過於復雜(如多種字體,多種顏色,條件格式等等)。
我們都知道,一個工作表有65536*256個單元格,這個非常大的一個范圍。我們在應用一些格式設置時,往往為了方便,直接在整行,或整列,或者在多行和多列中應用,這樣其實是不妥當的。我相信很少有人會用滿整列,或者整行。大量的沒有用到的單元格被加上了一些格式後,Excel並不總是知道這個單元格是不需要用的,而往往在計算時會包括這些單元格。另外,格式的多樣性(包括字體,顏色等),勢必是要造成Excel文件體積變大,這是不難理解的。
Ⅵ 區域網文本文檔批量數據導入到資料庫中資料庫需要校驗嗎
資料庫本身是不用校驗的,直接就進去了,關鍵還要看你檢驗
Ⅶ ASP.NET MVC網站處理大批量數據添加與查詢的優化方案
分析復iis日誌,解決掉5xx(服務代制碼錯誤),955(頁面載入過慢)
引入分布式緩存
資料庫讀寫分離
網站優化方案大方向都很固定,具體還是根據自己網站的實際情況。可以看看淘寶,京東出的技術書。裡面有他們網站的架構,各種問題有對應的解決方案,可以借鑒。
Ⅷ 開發網上書店,由於圖書量大,如何進行大數據的批量導入資料庫
不知你具體的數據源是什麼,格式怎麼樣,如果是格式規范的,現在都有數據遷移工具,如sql server自帶的導入導出工具可以批量的進行數據遷移
Ⅸ 幾種資料庫的大數據批量插入【轉】
首先說一下,IProvider里有一個用於實現批量插入的插件服務介面IBatcherProvider,此介面在前一篇文章中已經提到過了。///<summary>/// 提供數據批量處理的方法。 ///</summary>publicinterface IBatcherProvider : IProviderService { ///<summary>/// 將<see cref="DataTable"/> 的數據批量插入到資料庫中。 ///</summary>///<param name="dataTable">要批量插入的 <see cref="DataTable"/>。</param>///<param name="batchSize">每批次寫入的數據量。</param>void Insert(DataTable dataTable, int batchSize = 10000); }一、SqlServer數據批量插入SqlServer的批量插入很簡單,使用SqlBulkCopy就可以,以下是該類的實現:///<summary>/// 為System.Data.SqlClient 提供的用於批量操作的方法。 ///</summary>publicsealedclass MsSqlBatcher : IBatcherProvider { ///<summary>/// 獲取或設置提供者服務的上下文。 ///</summary>public ServiceContext ServiceContext { get; set; } ///<summary>/// 將<see cref="DataTable"/> 的數據批量插入到資料庫中。 ///</summary>///<param name="dataTable">要批量插入的 <see cref="DataTable"/>。</param>///<param name="batchSize">每批次寫入的數據量。</param>publicvoid Insert(DataTable dataTable, int batchSize = 10000) { Checker.ArgumentNull(dataTable, "dataTable"); if (dataTable.Rows.Count == 0) { return; } using (var connection = (SqlConnection)ServiceContext.Database.CreateConnection()) { try { connection.TryOpen(); //給表名加上前後導符var tableName = DbUtility.FormatByQuote(ServiceContext.Database.Provider.GetService<ISyntaxProvider>(), dataTable.TableName); using (var bulk = new SqlBulkCopy(connection, SqlBulkCopyOptions.KeepIdentity, null) { DestinationTableName = tableName, BatchSize = batchSize }) { //循環所有列,為bulk添加映射 dataTable.EachColumn(c => bulk.ColumnMappings.Add(c.ColumnName, c.ColumnName), c => !c.AutoIncrement); bulk.WriteToServer(dataTable); bulk.Close(); } } catch (Exception exp) { thrownew BatcherException(exp); } finally { connection.TryClose(); } } } }以上沒有使用事務,使用事務在性能上會有一定的影響,如果要使用事務,可以設置SqlBulkCopyOptions.UseInternalTransaction。二、Oracle數據批量插入System.Data.OracleClient不支持批量插入,因此只能使用Oracle.DataAccess組件來作為提供者。///<summary>/// Oracle.Data.Access 組件提供的用於批量操作的方法。 ///</summary>publicsealedclass OracleAccessBatcher : IBatcherProvider { ///<summary>/// 獲取或設置提供者服務的上下文。 ///</summary>public ServiceContext ServiceContext { get; set; } ///<summary>/// 將<see cref="DataTable"/> 的數據批量插入到資料庫中。 ///</summary>///<param name="dataTable">要批量插入的 <see cref="DataTable"/>。</param>///<param name="batchSize">每批次寫入的數據量。</param>publicvoid Insert(DataTable dataTable, int batchSize = 10000) { Checker.ArgumentNull(dataTable, "dataTable"); if (dataTable.Rows.Count == 0) { return; } using (var connection = ServiceContext.Database.CreateConnection()) { try { connection.TryOpen(); using (var command = ServiceContext.Database.Provider.DbProviderFactory.CreateCommand()) { if (command == null) { thrownew BatcherException(new ArgumentException("command")); } command.Connection = connection; command.CommandText = GenerateInserSql(ServiceContext.Database, command, dataTable); command.ExecuteNonQuery(); } } catch (Exception exp) { thrownew BatcherException(exp); } finally { connection.TryClose(); } } } ///<summary>/// 生成插入數據的sql語句。 ///</summary>///<param name="database"></param>///<param name="command"></param>///<param name="table"></param>///<returns></returns>privatestring GenerateInserSql(IDatabase database, DbCommand command, DataTable table) { var names = new StringBuilder(); var values = new StringBuilder(); //將一個DataTable的數據轉換為數組的數組var data = table.ToArray(); //設置ArrayBindCount屬性 command.GetType().GetProperty("ArrayBindCount").SetValue(command, table.Rows.Count, null); var syntax = database.Provider.GetService<ISyntaxProvider>(); for (var i = 0; i < table.Columns.Count; i++) { var column = table.Columns[i]; var parameter = database.Provider.DbProviderFactory.CreateParameter(); if (parameter == null) { continue; } parameter.ParameterName = column.ColumnName; parameter.Direction = ParameterDirection.Input; parameter.DbType = column.DataType.GetDbType(); parameter.Value = data[i]; if (names.Length > 0) { names.Append(","); values.Append(","); } names.AppendFormat("{0}", DbUtility.FormatByQuote(syntax, column.ColumnName)); values.AppendFormat("{0}{1}", syntax.ParameterPrefix, column.ColumnName); command.Parameters.Add(parameter); } returnstring.Format("INSERT INTO {0}({1}) VALUES ({2})", DbUtility.FormatByQuote(syntax, table.TableName), names, values); } }以上最重要的一步,就是將DataTable轉為數組的數組表示,即object[][],前數組的上標是列的個數,後數組是行的個數,因此循環Columns將後數組作為Parameter的值,也就是說,參數的值是一個數組。而insert語句與一般的插入語句沒有什麼不一樣。三、SQLite數據批量插入SQLite的批量插入只需開啟事務就可以了,這個具體的原理不得而知。publicsealedclass SQLiteBatcher : IBatcherProvider { ///<summary>/// 獲取或設置提供者服務的上下文。 ///</summary>public ServiceContext ServiceContext { get; set; } ///<summary>/// 將<see cref="DataTable"/> 的數據批量插入到資料庫中。 ///</summary>///<param name="dataTable">要批量插入的 <see cref="DataTable"/>。</param>///<param name="batchSize">每批次寫入的數據量。</param>publicvoid Insert(DataTable dataTable, int batchSize = 10000) { Checker.ArgumentNull(dataTable, "dataTable"); if (dataTable.Rows.Count == 0) { return; } using (var connection = ServiceContext.Database.CreateConnection()) { DbTransaction transcation = null; try { connection.TryOpen(); transcation = connection.BeginTransaction(); using (var command = ServiceContext.Database.Provider.DbProviderFactory.CreateCommand()) { if (command == null) { thrownew BatcherException(new ArgumentException("command")); } command.Connection = connection; command.CommandText = GenerateInserSql(ServiceContext.Database, dataTable); if (command.CommandText == string.Empty) { return; } var flag = new AssertFlag(); dataTable.EachRow(row => { var first = flag.AssertTrue(); ProcessCommandParameters(dataTable, command, row, first); command.ExecuteNonQuery(); }); } transcation.Commit(); } catch (Exception exp) { if (transcation != null) { transcation.Rollback(); } thrownew BatcherException(exp); } finally { connection.TryClose(); } } } privatevoid ProcessCommandParameters(DataTable dataTable, DbCommand command, DataRow row, bool first) { for (var c = 0; c < dataTable.Columns.Count; c++) { DbParameter parameter; //首次創建參數,是為了使用緩存if (first) { parameter = ServiceContext.Database.Provider.DbProviderFactory.CreateParameter(); parameter.ParameterName = dataTable.Columns[c].ColumnName; command.Parameters.Add(parameter); } else { parameter = command.Parameters[c]; } parameter.Value = row[c]; } } ///<summary>/// 生成插入數據的sql語句。 ///</summary>///<param name="database"></param>///<param name="table"></param>///<returns></returns>privatestring GenerateInserSql(IDatabase database, DataTable table) { var syntax = database.Provider.GetService<ISyntaxProvider>(); var names = new StringBuilder(); var values = new StringBuilder(); var flag = new AssertFlag(); table.EachColumn(column => { if (!flag.AssertTrue()) { names.Append(","); values.Append(","); } names.Append(DbUtility.FormatByQuote(syntax, column.ColumnName)); values.AppendFormat("{0}{1}", syntax.ParameterPrefix, column.ColumnName); }); returnstring.Format("INSERT INTO {0}({1}) VALUES ({2})", DbUtility.FormatByQuote(syntax, table.TableName), names, values); } } 四、MySql數據批量插入///<summary>/// 為MySql.Data 組件提供的用於批量操作的方法。 ///</summary>publicsealedclass MySqlBatcher : IBatcherProvider { ///<summary>/// 獲取或設置提供者服務的上下文。 ///</summary>public ServiceContext ServiceContext { get; set; } ///<summary>/// 將<see cref="DataTable"/> 的數據批量插入到資料庫中。 ///</summary>///<param name="dataTable">要批量插入的 <see cref="DataTable"/>。</param>///<param name="batchSize">每批次寫入的數據量。</param>publicvoid Insert(DataTable dataTable, int batchSize = 10000) { Checker.ArgumentNull(dataTable, "dataTable"); if (dataTable.Rows.Count == 0) { return; } using (var connection = ServiceContext.Database.CreateConnection()) { try { connection.TryOpen(); using (var command = ServiceContext.Database.Provider.DbProviderFactory.CreateCommand()) { if (command == null) { thrownew BatcherException(new ArgumentException("command")); } command.Connection = connection; command.CommandText = GenerateInserSql(ServiceContext.Database, command, dataTable); if (command.CommandText == string.Empty) { return; } command.ExecuteNonQuery(); } } catch (Exception exp) { thrownew BatcherException(exp); } finally { connection.TryClose(); } } } ///<summary>/// 生成插入數據的sql語句。 ///</summary>///<param name="database"></param>///<param name="command"></param>///<param name="table"></param>///<returns></returns>privatestring GenerateInserSql(IDatabase database, DbCommand command, DataTable table) { var names = new StringBuilder(); var values = new StringBuilder(); var types = new List<DbType>(); var count = table.Columns.Count; var syntax = database.Provider.GetService<ISyntaxProvider>(); table.EachColumn(c => { if (names.Length > 0) { names.Append(","); } names.AppendFormat("{0}", DbUtility.FormatByQuote(syntax, c.ColumnName)); types.Add(c.DataType.GetDbType()); }); var i = 0; foreach (DataRow row in table.Rows) { if (i > 0) { values.Append(","); } values.Append("("); for (var j = 0; j < count; j++) { if (j > 0) { values.Append(", "); } var isStrType = IsStringType(types[j]); var parameter = CreateParameter(database.Provider, isStrType, types[j], row[j], syntax.ParameterPrefix, i, j); if (parameter != null) { values.Append(parameter.ParameterName); command.Parameters.Add(parameter); } elseif (isStrType) { values.AppendFormat("'{0}'", row[j]); } else { values.Append(row[j]); } } values.Append(")"); i++; } returnstring.Format("INSERT INTO {0}({1}) VALUES {2}", DbUtility.FormatByQuote(syntax, table.TableName), names, values); } ///<summary>/// 判斷是否為字元串類別。 ///</summary>///<param name="dbType"></param>///<returns></returns>privatebool IsStringType(DbType dbType) { return dbType == DbType.AnsiString || dbType == DbType.AnsiStringFixedLength || dbType == DbType.String || dbType == DbType.StringFixedLength; } ///<summary>/// 創建參數。 ///</summary>///<param name="provider"></param>///<param name="isStrType"></param>///<param name="dbType"></param>///<param name="value"></param>///<param name="parPrefix"></param>///<param name="row"></param>///<param name="col"></param>///<returns></returns>private DbParameter CreateParameter(IProvider provider, bool isStrType, DbType dbType, object value, char parPrefix, int row, int col) { //如果生成全部的參數,則速度會很慢,因此,只有數據類型為字元串(包含'號)和日期型時才添加參數if ((isStrType && value.ToString().IndexOf('\'') != -1) || dbType == DbType.DateTime) { var name = string.Format("{0}p_{1}_{2}", parPrefix, row, col); var parameter = provider.DbProviderFactory.CreateParameter(); parameter.ParameterName = name; parameter.Direction = ParameterDirection.Input; parameter.DbType = dbType; parameter.Value = value; return parameter; } returnnull; } }MySql的批量插入,是將值全部寫在語句的values里,例如,insert batcher(id, name) values(1, '1', 2, '2', 3, '3', ........ 10, '10')。五、測試接下來寫一個測試用例來看一下使用批量插入的效果。
Ⅹ SQL批量插入數據幾種方案的性能詳細對比
技術方案一:
壓縮時間下程序員寫出的第一個版本,僅僅為了完成任務,沒有從程序上做任何優化,實現方式是利用資料庫訪問類調用存儲過程,利用循環逐條插入。很明顯,這種方式效率並不高,於是有了前面的兩位同事討論效率低的問題。
技術方案二:
由於是考慮到大數據量的批量插入,於是我想到了ADO.NET2.0的一個新的特性:SqlBulkCopy。有關這個的性能,很早之前我是親自做過性能測試的,效率非常高。這也是我向公司同事推薦的技術方案。
技術方案三:
利用SQLServer2008的新特性--表值參數(Table-Valued Parameter)。表值參數是SQLServer2008才有的一個新特性,使用這個新特性,我們可以把一個表類型作為參數傳遞到函數或存儲過程里。不過,它也有一個特點:表值參數在插入數目少於 1000 的行時具有很好的執行性能。
技術方案四:
對於單列欄位,可以把要插入的數據進行字元串拼接,最後再在存儲過程中拆分成數組,然後逐條插入。查了一下存儲過程中參數的字元串的最大長度,然後除以欄位的長度,算出一個值,很明顯是可以滿足要求的,只是這種方式跟第一種方式比起來,似乎沒什麼提高,因為原理都是一樣的。