SQL高阶问题,低手莫入!(100分)

  • 主题发起人 主题发起人 zyzdy
  • 开始时间 开始时间
能不能介绍一下“台湾联诠信息的转文件过帐组件”,它能不能直接用在三层结构中
的client端来传输数据呢???
 
OLEDB的全部资料在msdn中,编译新的oledb程序必须安装新的windows platform sdk。
随着DotNet的启动,专门针对SQL Server 2000的Fast Data Access速度将会更快。
 
各位老大:

   小弟再说清楚一点,事情原由是这样的,我从一个数据库产生一个DataSet数据集

我要将这个数据集装进另一个数据库(系统都不同,一个是AS400,另一个是SQL),

另AS400过来的数据集非常之大,如有80万条记录在数据库在显示单表就有60多M

所以,我的构想是这样:

  1、对AS400过来的数据集分页,这一点ADO+ODBC可以作到。

  2、然后我按每页的将数据装入我的SQL当中,所以要求对OLE DB编程或

对ADO来讲有一个快速的装入方法,不然,我有三十张表的话肯定死定了。而这一步

我是没法做到。(insert方法绝不可行,效率太低,铁定被老板打死了)

3、我记得有个朋友讲解过一个直接对原生ADO写程序的例子效率可提高70%,我

想应差不多了。

  4、不知有个叫温柔一刀的能否看见,唉,我还差他400分呐,实在不好意思叫他再来

答我的题了。
 
转成文本文件,从文本文件再倒到另一个里面。如何?
SQL支持么? ORACLE支持,应该比INSERT快
 
唉,我曾经做过insert语句,一分钟一百来条数据,让客户骂了半天,真没面子
 
听听总可以吧
 
to:true64

将数据集存在TXT不现实,花的时间太长,我也知道,你的意思是将TXT用

bulk into数据。我不认为这是一个好方法。
 
想了个笨办法,开两个线程,一个import,一个export 。
分页将数据用BatchMove到临时库,顺序生成bak01.dbf,bak02.dbf.....
生成一个就写入ini文件,通知另一个线程。
同时另一边检测ini文件有没有生成临时库,有就开始....

呵呵,骗分骗分啦。
 
我知道 用 adodataset.next 与 adodataset.recordset.movenext 两者速度相差 20 倍!

如果直接用Insert(value1,value2...) 是 100s 的话,那么:
1: insert into () values(:w1,:w2...)
prepared 后
在循环里 对参数赋值 的速度是 20 s
2: 原生的Ado 操作插入是 15-20 s
3: 用Sql 的StoreProcedure 是 15 s


以上是我在实际当中测试的结果,希望对你做这个程序有用!
 
使用SQLDMO这个COM组件编程,它是SQLSERVER自带的,其实Enterprise Manager就是基于
SQLDMO编写的,我查过了,用SQLDMO可以实现和IMPORT/OUTPORT相同的功能,速度很快。

希望能帮你!
 
to:Aloney

非常感谢你的帮助,我也确实找到了这个组件,它是以DLL形式提供的。

里面复杂得很,我一看头都大了那位老兄长有示例。小弟在此谢过。

 
我真他妈的笨,下面的语句我都实现不了:
那个窗没关我跳下去算了。


var vf,vv:OleVariant; //vf是字段列表,vv是值列表
begin
vf:=VarArrayOf(['字段1','字段2']);

// 循环
vv:=VarArrayOf([字段1值,字段2值]);
adotable1.Recordset.AddNew(vf,vv);
// 循环

我照上面的示例写的代码,为何不过。。。。(我用Cbuiler)

OleVariant VF,VV;
VF=VarArrayof("aa","ab"');
for(int a=0;a<count;a++)
{
VV=VarArrayof(SQL->Recordset->Fields[0]->AsString,SQL->Recordset->Fields[1]->AsString);
AQL->Recordset->AddNew(VF,VV);
SQL->Recordset->Next();
}

 
老兄,心急吃不了热豆腐哦。
delphi下:function VarArrayOf(const Values: array of Variant): Variant;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C++builder下:VarArrayOf(const Variant * Values, const int Values_Size);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 
在此处出错, AQL->Recordset->Open(SU,AC,0,0,0);
该如何用这句话呢?

AQL->Recordset->Open(SU,AC,2,2,0);
VF.PutElement("AA",0);
VF.PutElement("AB",1);
for(int a=0;a<count;a++)
{
VV.PutElement("AA",0);
VV.PutElement("19761219",1);
AQL->Recordset->AddNew(VF,VV);
}
 
1.如果你不能真正disable SQL SERVER 的 transction的话,
恰好应该显示调用transction,可以很大提高速度(至少提高几十倍)
2.目标数据库是SQL Server的时候,可以用一次提交多条SQL语句的办法提高速度
3.如果多条SQL语句一次提交,使用原生ADO对象还可以提高速度

这三种办法同时使用的话,应该可行,我在一台极烂的server上测试,
一万条sql语句(不过只有两个字段),用时十几秒钟。。。
 
我真的很感谢各位的帮助。我觉得也许我的要求太高了一点,现面状态是这样了

现在表叫A1,其中有20字段,目前记录条数914,883,数据大小79M,其中一条index就有

[acmvpf_batctrcde 13MB],跑在SQL Server7.0上面。

各位的方法比我以前确实快了不少。。有了不少的进步。。。特别是温兄的建议....

但现实状态不容我乐观:现在一家分公司就有90万条,我们公司现有十多家分公司,且还

在不断的开分公司;那么看来,数据至少应有900万条了样子。就是现在我用microsoft

的Import or Export也得花上快大半小时。。要是全部分公司都上线的话。同步一个

表就要好几个小时,我想我咨询了一下IBM与microsoft公司,他们的建议是我将源数据

处理为TXT文件,然后用microsoft特别处理的大量数据装载过程,效率会很高的,比写

程序的方式快二至三倍的样子,所以,我打算改用这种方式处理了。。

还有,我知道在Delphi中用原生的ADO,很方便,便我在C Builder中花了很多时间也

无法使用源生的ADO,我也动过念头使用adoint&amp;&amp;ole db,直接调用ADO的API不过实在

惭愧,还没能在C Builder中实现Addnew 的操作。。。。不知可有高人愿指点小弟一、二

。。唉,我想我应该去死。。。
 
相对来说,是不是DB-LIBRARY更快,它提供相对应的bcp函数bcp_readfmt,bcp_writefmt
 
这就奇怪了,这么大的数据量,需要每次实时同步么?

如果天天都要实时同步,那很显然应该改改应用策略了,
比如生成TXT文件的时候,使用多台机器(针对若干分公司)同时生成,
再使用上面所说的办法。。。。

总之不应该什么事情都通过一个程序联机处理。
 
后退
顶部