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效率相关的话:
“能用一句语句处理的任务决不要用多句编程来实现”。
原来老是怕一句执行时,回滚段不够大,看来只能准备好硬盘为上策了