datatable大數據
① 大數據系統數據表導入時出現錯誤是什麼原因
1.導入的時候access中的表名必須是大寫的,否則導進去之後,因為sqlplus運行到後台的時候會把所有字元自動變為大寫,而oracle大小寫敏感,所以生成的小寫表無法訪問,你用toad或DBARtsion也是白搭
2.表中的欄位名稱比如user之類的改進改名,很有可能就會因為這個卡掉,得重新導
3.注意資料庫中的數據,有可能會出現因為數據導致導入一半後卡住,出現這種問題的時候多半是因為備注轉化為的對象類型不對
4.ACCESS中的備注問題,這個是個頭疼的問題,真tm頭疼,剛開始我用OLE
DB方式連接資料庫,備注默認轉化的oracle數據類型為LONG,但是TNND每張oracle表中最多隻有一個LONG類型的欄位,(古怪的規定~!我找了半天沒找到原因)
② C# 處理大數據量讀取問題
1.可以使用存諸過程+臨時表的方式,具體請研究或是Bai.
2.可以使用SqlServer的SqlBulkCopy,NET有相關的支持.比一行行插入速度提高1K倍以上.
SqlBulkCopy bulkCopy = new SqlBulkCopy(conn);
bulkCopy.DestinationTableName = "SpecialList";
bulkCopy.BatchSize = 500;
bulkCopy.BulkCopyTimeout = 300;
if (dt != null && dt.Rows.Count != 0)
{
bulkCopy.WriteToServer(dt);
}
SORRY,我看錯了.OTP.NET也有對OracleBulkCopy的支持,用法大同小異,比循環插入和拼接SQL快了一止一點點...
③ C#:幾種資料庫的大數據批量插入
/// <summary>
/// 提供數據批量處理的方法。
/// </summary>
public interface 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>
public sealed class 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>
public void 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)
{
throw new BatcherException(exp);
}
finally
{
connection.TryClose();
}
}
}
}
SqlBulkCopy的ColumnMappings中列的名稱受大小寫敏感限制,因此在構造DataTable的時候應請注意列名要與表一致。
以上沒有使用事務,使用事務在性能上會有一定的影響,如果要使用事務,可以設置SqlBulkCopyOptions.UseInternalTransaction。
二、Oracle數據批量插入
System.Data.OracleClient不支持批量插入,因此只能使用Oracle.DataAccess組件來作為提供者。
/// <summary>
/// Oracle.Data.Access 組件提供的用於批量操作的方法。
/// </summary>
public sealed class 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>
public void 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)
{
throw new BatcherException(new ArgumentException("command"));
}
command.Connection = connection;
command.CommandText = GenerateInserSql(ServiceContext.Database, command, dataTable);
command.ExecuteNonQuery();
}
}
catch (Exception exp)
{
throw new BatcherException(exp);
}
finally
{
connection.TryClose();
}
}
}
/// <summary>
/// 生成插入數據的sql語句。
/// </summary>
/// <param name="database"></param>
/// <param name="command"></param>
/// <param name="table"></param>
/// <returns></returns>
private string 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);
}
return string.Format("INSERT INTO {0}({1}) VALUES ({2})", DbUtility.FormatByQuote(syntax, table.TableName), names, values);
}
}
以上最重要的一步,就是將DataTable轉為數組的數組表示,即object[][],前數組的上標是列的個數,後數組是行的個數,因此循環Columns將後數組作為Parameter的值,也就是說,參數的值是一個數組。而insert語句與一般的插入語句沒有什麼不一樣。
④ mysql在轉儲大數據數據表是不是要影響資料庫運行
這個是肯定會影響,mysql單表也就是百萬級的資料庫,再多了就很慢了,需要分表或者集群了;
⑤ Excel表格中我有一份大數據表,是公司識別號加數據,一份小數據表,是
可以用函數公式,數組公式,VBA代碼,但是所有這些都須要,看到數據詳情,不然沒辦法具體回答。
⑥ 如何提高ORACLE大數據表Update效率
1.把表上的取消
2.把表上的INDEX取消
但是依然很慢,無奈下找到這個:
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:6407993912330
在這個主題問答里,ORA官方提了一種處理的辦法:
1.利用CREATE table as select xxxxx的辦法來生成一新表T1
2.在T1上創建與目標表一樣的索引
3.把目標表刪除或RENAME(注意備份以備反悔)
4.把T1改名成目標表
試了一下,果然非常地快,我的任務差不多在2Min就完成了。
如csywdk.table_room是一張大表,要刪除其中bakfwid在noNewYWFW20081205中的記錄,且要更新bakfwid在imp_table_room中記錄的ROOM_LOC為imp_table_room.room_loc:
(1)創建新表
create table tmp_new_table_room081205 as
select t1.ROOM_ID,t1.NEWROOMID,t1.BUILDID,t1.TFH,t1.DKH,t1.BUILD_NO,t1.LAYER_NO,t1.ROOM_NO,t1.ROOM_NAME,
decode(t2.bakfwid,null,t1.ROOM_LOC,t2.room_loc)
t1.ROOM_AREA,
t1.SURTYPE,t1.LAYER_NAME,t1.DEVDEP,t1.CELL,t1.DELFLAG,t1.QXXZ,t1.SJSJLSH,t1.FD,t1.ID,t1.BAKFWID
from csywdk.table_room t1 left join imp_table_room t2 on t1.bakfwid=t2.bakfwid
where not exists(select 1 from noNewYWFW20081205 t3 where t3.bakfwid=t1.bakfwid)
(2)創建備份表
create table Table_room081205 as
select * from csywdk.table_room
(3)替換原表
drop table sde.table_room
create table sde.table_room as
select * from tmp_new_table_room081205
⑦ c# 如何快速處理大數據量得查詢及顯示
對於大量的數據
分頁的時候,我們可以按需取數據。
行得到記錄
總數
,
Rscount,
然後
根據自己需要設定的每頁顯示的記錄條數,
如
12條
再計算
可以分成多少頁
Pagecount=
Rscount/12
如果是第5頁,
則取第6頁的12條記錄,頁碼是可以用變數的,如PageSize
每次給不同的頁值。
select
top
12
*
from
表
where
Id
not
in(select
top
5*12
Id
from
表
order
by
id
desc)
order
by
Id
desc
以此類推和
擴展。
20萬條記錄的資料庫
用access
太可憐了!
⑧ asp.net用datatable好還是用 dataview好
DataView.RowFilter和DataTable.Select都具有對表進行過濾得到結果的功能。在數據量比較小的時候效率沒有分別,但是對於大數據量,DataView.RowFilter比DataTable.Select的效率要慢很多。
從內部實現上就可以看出來,DataView.RowFilter是每次都對DataTable建立一個視圖,然後再進行操作。
我做以下測試:DataTable數據記錄數3400條,過濾操作3000,DataView.RowFilter完成的速度為100秒,DataTable.Select的速度為1.5秒。可見速度相差之大。
所以在做該類操作的時候請使用DataTable.Select。
⑨ c# 如何提高大數據量查詢速度
首先要優化查詢語句,用不到的數據列盡量不要查。
然後是優化資料庫,比如內多建幾個索引,序列化容,應用存儲過程等等。
最後是不要反復查資料庫,會太慢,把查出的數據放到
XML中或是DataTable中,以後再用的時候直接到XML中去查,
這樣會省出大量的時間。。。。。
⑩ 如何提高Oracle大數據表Update效率
ORACLE中如果表數據量很大(級或更大),update某個欄位是很慢的(如我的HIS項目中更新歷史業務流程表,160萬條記錄,用CURSOR來更新,1000條COMMIT一次,花了4天也沒更新完),後來嘗試過的改進辦法有:
1.把表上的LOGGING取消
2.把表上的INDEX取消
但是依然很慢,無奈下找到這個:
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:6407993912330
在這個主題問答里,ORA官方提了一種處理的辦法:
1.利用CREATE table as select xxxxx的辦法來生成一新表T1
2.在T1上創建與目標表一樣的索引
3.把目標表刪除或RENAME(注意備份以備反悔)
4.把T1改名成目標表
試了一下,果然非常地快,我的任務差不多在2Min就完成了。
如csywdk.table_room是一張大表,要刪除其中bakfwid在noNewYWFW20081205中的記錄,且要更新bakfwid在imp_table_room中記錄的ROOM_LOC為imp_table_room.room_loc:
(1)創建新表
create table tmp_new_table_room081205 as
select t1.ROOM_ID,t1.NEWROOMID,t1.BUILDID,t1.TFH,t1.DKH,t1.BUILD_NO,t1.LAYER_NO,t1.ROOM_NO,t1.ROOM_NAME,
decode(t2.bakfwid,null,t1.ROOM_LOC,t2.room_loc)
t1.ROOM_AREA,
t1.SURTYPE,t1.LAYER_NAME,t1.DEVDEP,t1.CELL,t1.DELFLAG,t1.QXXZ,t1.SJSJLSH,t1.FD,t1.ID,t1.BAKFWID
from csywdk.table_room t1 left join imp_table_room t2 on t1.bakfwid=t2.bakfwid
where not exists(select 1 from noNewYWFW20081205 t3 where t3.bakfwid=t1.bakfwid)
(2)創建備份表
create table Table_room081205 as
select * from csywdk.table_room
(3)替換原表
drop table sde.table_room
create table sde.table_room as
select * from tmp_new_table_room081205
在這個問答里還提到一句ORA PL/SQL效率相關的話:
「能用一句語句處理的任務決不要用多句編程來實現」。
原來老是怕一句執行時,回滾段不夠大,看來只能准備好硬碟為上策了