大数据操作的问题? 你用什么导呀?DTS? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 代码比较多,就是select表中的数据,然后通过一定的比对条件循环append到另一个数据库中的表中,用的是ADO 代码比较多,就是select表中的数据,然后通过一定的比对条件循环append到另一个数据库中的表中,用的是ADO---这样肯定慢!既然是数据库之间的操作,为什么不用DTS? 还是用DTS或者是BCP工具吧,那样很快,直接用SQL语句倒数据就慢,至于是为什么,就不清楚了 谁能回答一下:还是用DTS或者是BCP工具吧,那样很快,直接用SQL语句倒数据就慢,至于是为什么,就不清楚了上面写的原因啊,谢谢 不是一个单纯的数据传输,是要通过一定的比对条件传输的,DTS或者是BCP工具,能作到吗? dm_trans->Sql_Find->Close(); dm_trans->Sql_Find->SQL->Clear(); dm_trans->Sql_Find->SQL->Add("delete from "+tablename+" where c_trans='0' "); dm_trans->Sql_Find->ExecSQL(); AnsiString c_sql="select * from "+tablename+" where "; c_sql+="aae>='"+LastTime+"' and aae<='"+ThisTime+"'"; dm_trans->Query_Find->Close(); dm_trans->Query_Find->SQL->Clear(); dm_trans->Query_Find->SQL->Add(c_sql); dm_trans->Query_Find->Open(); int count=dm_trans->Query_Find->RecordCount; Memo1->Lines->Add("共:"+IntToStr(count)+" 条需要传输数据 "); dm_trans->Query_Find->First(); int trans_count=0; ProgressBar1->Max=count; ProgressBar1->Position=0; int progress_count=0; dm_trans->Sql_Find->Close(); dm_trans->Sql_Find->SQL->Clear(); dm_trans->Sql_Find->SQL->Add("select * from "+tablename+" where 1=0 "); dm_trans->Sql_Find->Open(); int ColCount=field_count; while (!dm_trans->Query_Find->Eof) { try{ try{ dm_trans->Sql_Find->Append(); for(int j=0;j<ColCount;j++) { dm_trans->Sql_Find->Fields->Fields[j]->Value=dm_trans->Query_Find->Fields->Fields[j]->Value; } dm_trans->Sql_Find->Post(); trans_count++; } catch(Exception& e) { Memo1->Lines->Add("传输:"+tablename+" 数据发生错误:"+e.Message); } } __finally { dm_trans->Query_Find->Next(); progress_count++; ProgressBar1->Position=progress_count; } } Memo1->Lines->Add("成功完成:"+IntToStr(trans_count)+" 条数据 ");}catch(Exception& e){ Memo1->Lines->Add("读取表:"+tablename+" 发生错误:"+e.Message);} 对C#我不懂,只能大致给你提供下思路。如果是大数据导出最好用BCP,可以带WHERE条件的。如果你不用BCP,那么最好能分段导出,每段是一个事物,不要把所有导出作为一个事物(这样会需要大量的内存)。BCP语法:master..xp_cmdshell 'bcp "sselect * from tbname where condition " queryout "c:\filename" -c -q -Sserver -Uuid -Ppwd'master..xp_cmdshell 'bcp "database_name.][owner].]{table_name" queryin "c:\filename" -c -q -Sserver -Uuid -Ppwd' SQL中大数据的转移基本上就是DTS 比较而言 BCP占用资源低 效率高 但是因为是命令行工具 使用起来不是很方便你的程序我看不懂:( 针对你的数据推荐的方法:1. DTS 方便可以在程序中控制2. SQL发布和复制,简单非常方便的GUI操作 用SQL的数据导入导出工具用程序,每次导入的数据库,用条件,每次打开的记录数不要太大 楼主给出的逻辑并不复杂:1.先删除Table中 c_trans='0' 的数据;2.取出 aae>={LastTime} and aae<={ThisTime} 的数据插入到Table中;建议使用DTS,第一步用一个"执行SQL任务",第二步用一个"数据传输任务"就可以了. 又测试了2次,发现SQL SERVER占用的内存很大,多的时候有7、8百M,为什么呢? 如果你的物理内存有1G+ SQL此时占用7,8百M的内存是正常的情况 SQL会平衡系统所需的内存 将余下的内存用到只剩下5-10M也是正常的 在没有内存压力的情况下SQL会把查询内容保存在内存中以供下次使用。 但是有时会报内存不足的错误啊,可否在不影响正常处理工作的情况下,限制SQL占用的内存? 其实SQL SERVER就是一个比较吃内存的程序,他会把用到过的所有数据都放到内存中,然后给他设上一个计数器,过一段时间,扫一次内存,然后当内存不够时,把计数器值最小的给清出去。我建议还是使用BCP来导数据库。因为DTS导的时候内存和使用和日志的记录量也不小。没有试过,只是建议主。 限制内存当然可以 在Enterprise Manager里面操作它具体报错信息是什么? 开始处理时: begin transaction T1当处理的数据量达到整万时: commit transaction T1 begin transaction T1结束时 commit transaction T1 试试。这是一种思路而已。 查询一张表中同一时间的内容? 帮从SQL导出到Book1.xlsx那么不对哦 求SQL语句! 表数据取某个字段最大的数据查询 怎样跟服务器上的数据库同步 删除符合查询结果的数据 SQL求 如何用SQL语句导入一个文件 如何获得我所连接SQL SERVER实例的IP地址? 请教一个CASE WHEN的使用问题 请问如何取a字段中第一个字符? 如何将select得到的结果导出成.dbf文件
还是用DTS或者是BCP工具吧,那样很快,直接用SQL语句倒数据就慢,至于是为什么,就不清楚了上面写的原因啊,谢谢
dm_trans->Sql_Find->SQL->Clear();
dm_trans->Sql_Find->SQL->Add("delete from "+tablename+" where c_trans='0' ");
dm_trans->Sql_Find->ExecSQL(); AnsiString c_sql="select * from "+tablename+" where ";
c_sql+="aae>='"+LastTime+"' and aae<='"+ThisTime+"'"; dm_trans->Query_Find->Close();
dm_trans->Query_Find->SQL->Clear();
dm_trans->Query_Find->SQL->Add(c_sql);
dm_trans->Query_Find->Open();
int count=dm_trans->Query_Find->RecordCount;
Memo1->Lines->Add("共:"+IntToStr(count)+" 条需要传输数据 ");
dm_trans->Query_Find->First();
int trans_count=0; ProgressBar1->Max=count;
ProgressBar1->Position=0;
int progress_count=0; dm_trans->Sql_Find->Close();
dm_trans->Sql_Find->SQL->Clear();
dm_trans->Sql_Find->SQL->Add("select * from "+tablename+" where 1=0 ");
dm_trans->Sql_Find->Open();
int ColCount=field_count; while (!dm_trans->Query_Find->Eof)
{
try{
try{
dm_trans->Sql_Find->Append();
for(int j=0;j<ColCount;j++)
{
dm_trans->Sql_Find->Fields->Fields[j]->Value=dm_trans->Query_Find->Fields->Fields[j]->Value;
}
dm_trans->Sql_Find->Post(); trans_count++;
}
catch(Exception& e)
{
Memo1->Lines->Add("传输:"+tablename+" 数据发生错误:"+e.Message);
}
}
__finally
{
dm_trans->Query_Find->Next();
progress_count++;
ProgressBar1->Position=progress_count;
}
} Memo1->Lines->Add("成功完成:"+IntToStr(trans_count)+" 条数据 ");
}
catch(Exception& e)
{
Memo1->Lines->Add("读取表:"+tablename+" 发生错误:"+e.Message);
}
BCP语法:
master..xp_cmdshell 'bcp "sselect * from tbname where condition " queryout "c:\filename" -c -q -Sserver -Uuid -Ppwd'
master..xp_cmdshell 'bcp "database_name.][owner].]{table_name" queryin "c:\filename" -c -q -Sserver -Uuid -Ppwd'
你的程序我看不懂:(
1. DTS 方便可以在程序中控制
2. SQL发布和复制,简单非常方便的GUI操作
用程序,每次导入的数据库,用条件,每次打开的记录数不要太大
1.先删除Table中 c_trans='0' 的数据;
2.取出 aae>={LastTime} and aae<={ThisTime} 的数据插入到Table中;建议使用DTS,第一步用一个"执行SQL任务",第二步用一个"数据传输任务"就可以了.
它具体报错信息是什么?
当处理的数据量达到整万时: commit transaction T1 begin transaction T1
结束时 commit transaction T1
试试。这是一种思路而已。