大量sql语句的执行问题(200分)

  • 主题发起人 主题发起人 cAkk
  • 开始时间 开始时间
C

cAkk

Unregistered / Unconfirmed
GUEST, unregistred user!
首先声明: 数据库是<b>本地</b>的<b>sql server 7.0</b>

我的程序每7秒左右要动态生成大约500多条UPDATE语句,
我想一次全部执行,就像store proc一样, 但是我不知道
tquery的sql属性能否支持多个sql语句,我记得有些数据库
是可以支持的,不知道sql server 7.0可不可以?

另外,我之所以这么做,是因为我<b>以为</b>一次执行多条sql语句比
一条一条分别执行要速度快,不知道我的想法是否
 
Cakk:
你真够黑的,一次要执行几百次 sql. 恐怕不行吧。
 
UPDATE语句我不知道是否可以,
但DELETE可以的,我试过在一个Query中执行两条DELETE语句.
 
可以 import type library
sql 7 ....

引用

var
sql: SQLServer; //
dat: database; //数据库
s:string;
begin
sql:=CoSQLServer.Create;
sql.connect(server,'sa','pwd');
dat:=sql.databases.item('dbname');
dat.executewithresults(s,0); // s 不能大于64k,
end;

这是最快的方法了。
 
另:你怎么会这么多sql,不会把,全不同嘛,你能保证记录不重复嘛;
update的索引建立的好不好,
其实在sql里,update相当于一次insert和一次delete,这么频繁,
你的填充因子应该小些,否则很慢的。
应该尽量优化一下你现在的工作模式。不妨把详细一点的情况说出来
帮你出出主意。
 
Energy: 你的方法看起来很酷,我会试一试的.
---是不是装了sql 7.0就有这个类型库?

另外,我的程序是这么回事:
通过卫星卡实时接受股票数据,接受的程序是现成的DOS程序,由别人提供,
每次(10秒间隔)接受数据后,写到dbf库里面,每个股票一条记录.

我的程序负责每10秒检查dbf库,然后同我的dbf副本做对比,挑出更新的
数据,生成相应的sql语句,然后把sql文本通过winsock发送到远程的机器上,
在远程的机器上有sql 7.0和一个我的server程序,server程序负责监听并
接受sql文本,然后直接更新sql 7.0数据库里面的股票数据.

通常情况下,每次更新有10%的股票,也就是差不多100多条记录,股市火的
时候会达到50%,也就是差不多500条记录需要更新,我必须为每条记录生成
一个UPDATE语句.

有什么更好的方法吗?
 
有,没必要这么繁,首先你的数据库到底多大,我指实际的size,
第二,你的远程是多远,如果是电话线,现在这个办法不合适,因为数据量很大
而且有很多冗余。
如确实远,应该尽量简化数据,比如一个id,和变化量,而且可以不用ascii方式
传,更快。
第三,我始终没搞懂,你的程序如何能和dos程序一起工作?局域网嘛,
那就更简单了,由于股票数是基本固定的,所以更新只要一句话,如果他的文件
size不大的话。
update t1,t2 set ....,t2.modify=true where t1.id=t2.id and t1.val<>t2.val
如果很大,可以用foxpro作这个程序,因为他读foxpro库的方法比较特殊,所以比较


 
>>首先你的数据库到底多大,我指实际的size,
大概500-600k

>>你的远程是多远,如果是电话线,现在这个办法不合适,
虽然距离挺远,但是用专线,网络传输可以不用考虑. 并且我传送的sql文本
是压缩了之后再传的, 几十k的文本压缩后只有不到2k,网络传送几乎没有
延时.. :-)

>>我始终没搞懂,你的程序如何能和dos程序一起工作?
他干他的,我干我的.反正双方只关心dbf文件. 它的dos程序估计是直接读取
dbf文件来写更新数据的. 而我的程序通过BDE读取dbf数据库.
我的程序并不关心那个dos程序何时从卫星接受并更新数据,我只须每10秒去
读取最新数据就可以了.

>>update t1,t2 set ....,t2.modify=true where t1.id=t2.id and t1.val&amp;lt;&amp;gt;t2.val
这句话我还没怎么看懂,能稍微详细一点吗?
我的dbf和sql 7.0数据库是在2台距离很远的机器上的,而且数据库结构不一样.

>>由于股票数是基本固定的,所以更新只要一句话
这句话也请详细说明一下,如果真的可以只用一句搞定,那就简单多了,多谢!

>>可以用foxpro作这个程序,
不太可能,foxpro读出来数据什么也干不了呀! 我需要把更新的部分生成sql
语句,传送到另一台远程机器上,更新那台机器上的sql 7.0数据库.
 
一句话指的是你在本地更新数据时确实只要一句。你的库比他的库多一个标识字段,
标识是否改变了。做完后在重制标志位。
你的表和他的表在相同id下要检验的数据相同则为更改过,否则没有,见上,这样
的条件下用他的表更新你的表,500K应该很快的,估计3秒就可以解决。

在sql传过去后,你可以这样做(500条太多了)
因为股票涨幅不会太大,你可以把相同涨幅的数据抽取出来。用这样sql
update table set val=val+d where id in (111,3333,4444,555)
这样可能要执行的语句比你现在的肯定要少。
你传数据也可以简化为
变化幅度=id
.....
这样用tstringlist,sort一下,相同的幅度马上就可以出来了。


 
ok,我考虑一下.
 
To: Energy
那你如何实现本地与远程数据的基数保持同步?如果通信中断
程序将显示错误的信息,也就是说程序没有自我纠错功能,我认为
程序还应该传送增量的同时,还应该传送增量的基数!
 
也许你不需要自己用Delphi写程序作这件事情。sqlserver7提供的DTS(Data Transfermation Services)功能可以定时进行数据的转移,支持多种源数据格式,同时提供使用VBScript或者JavaScript等语言的功能,不妨试一试。
 
"sqlserver7提供的DTS" 能支持远程机器上的dbase数据库吗?
另外,因为库的结构不一样,需要程序进行字段名的映射,DTS能做到吗?
还有,通过VBS,JS是不是会速度很慢?
 
cAKK:深度立宪有个SQL SCRIPT,支持多条的好象
 
CJ: 我会看看的.
 
一个好消息: 我在sql 7.0上面用500条UPDATE语句测试,结果只用了1-2秒!!!!!

以前我一直是在dbase上测试的,500条语句耗时10秒,没想到sql 7.0效率这么高!
看来文件数据库和数据库服务器差别还是很大牙!!

哈哈!现在基本上没什么瓶颈了:

<b>提取更新数据-&amp;gt;生成相应SQL语句-&amp;gt;打包压缩-&amp;gt;网络传输-&amp;gt;解压缩-&amp;gt;执行SQL语句</b>

上面全过程现在可以控制在5秒左右了!!
 
>>"sqlserver7提供的DTS" 能支持远程机器上的dbase数据库吗?
Yes
>>另外,因为库的结构不一样,需要程序进行字段名的映射,DTS能做到吗?
Yes
>>还有,通过VBS,JS是不是会速度很慢?
Try it
 
多人接受答案了。
 
后退
顶部