bde的query第一次更新sqlserver怎么会这么慢???急!!!(200分)

  • 主题发起人 liangliang
  • 开始时间
L

liangliang

Unregistered / Unconfirmed
GUEST, unregistred user!
发现用tquery的更新sqlserver 数据库的某张表时(直接下sql,或用fieldbyname('xx').value:=xx一样),
当更新第一笔的速度奇慢,用sql monitor跟踪发现,它第一次是先把
远端的那张表的所有数据先拉回本地,再作处理。导致第一次更新表的速度奇慢,和那张表的容量成正比。
我调过了能调的所有选项,可还是这样,各位有遇到这种问题吗,是怎么解决的?
另外,同样的更新,在oralce上不会有这种事情,用sqlmonitor 分析发现,因为它只从远端抓取了需要更新的那笔纪录。
而且如果换ado连sqlserver也不会发生这种事情?
可为什么连sqlserver会要抓取所有数据呢?
 
各位大虾,嫌分少吗,我可以在加阿?很急啊!!!
难道都没有碰到过这个问题吗?
 
前台表顯示控件將TQuery換成TTable控件,因為使用TQuery時會將表中所在的記錄全下
到本機上。而且刷新時的TTable.Refresh比TQuery的 Close OPen locate要快一些。
這應該是一個分頁的機制在作怪
如更新表時,建議使用TQUERY控件直接寫SQL語句更新:
with Query1 do
begin
close;
SQL.Clear;
SQL.ADD(' Update table set ....where ....');
ExecSQL;
end;
 
to bes96261,
用table在第一次开表的时候同样会把所有数据拉下来,所以更新的时候会感觉快
而且,table用在本地数据库还行, 用在sqlserver的上效率不高的阿。
同样的,只要有query控件连着那张表,即便用
with Query1 do
begin
close;
SQL.Clear;
SQL.ADD(' Update table set ....where ....');
ExecSQL;
end;
也会拉下所有数据,你可以用sql monitor看看,但是同样的操作,在oracle就不会发生,
它只抓需要更新的那一笔。

各位高手,还有别的说法吗?
 
如果先prapare一下会加快速度
 
to sunnie
和prepare 应该没有关系,用sql-monintor察看,发现query 已经隐示的用了perpare
 
呵呵,使用update语句也会把所有数据返回客户端?不可能把?
是不是你其他地方写了什么代码,导致服务器数据变化就更新客户端?
如果只有update语句,肯定不会返回数据到客户端
不用try了,否则SQL Server怎么混?
 
to twos:
别不信,(以下2种方法最简单的方法,你可以试一试)看会不会。
1。在form中放入tquery,tdatabase,tdatasource,tdbgrid,并设好相互的关系,和数据库的连接
在query的sql里写入如'select * from XX', 把requestlive 设为true,以使它能修改,运行程序,在
dbgrid中修改任何一个字段,然后移开,你再看sql monitor 是不是fetch了所有数据?

2.放入2个query,2个query的requestlive 都设成false, 然后其中一个的sql.写入'select * from xx'
后open, 另一个写入update xx set .. where ..,运行程序,执行query2的update,
你再看sql monitor 是不是也fetch了所有数据?

注意:那张表的容量要大一些,如果,在query1 open 的时候,已经fetch了所有的数据,那么update时
是不会再次fetch的。我用的是sqlserver自带的northwind数据库中的orders表,大家帮我试一试看会不会啊。

各位高手到底是什么原因阿???,帮帮忙啊!!
 
用Query 打开库,不用 Select *
1.用 Select field1,field2,field3... where .....
不读不使用的字段,可以快一点
2.Select * From TableName Where <条件>
使用一个条件,读0条记录回来,如 ID = 0 等等
这样打开库时,可以快上些吧。
不知道还有什么更好的办法?
 
你那样写查询语句当然全部过来,这种问题也要谈论?
和你的更新有什么关系?
如果你只是一个update传过去只有一条影响
你不要钻牛角尖了
 
to zqs10597249
select * from XX 会返回所有数据这没错啊,可我现在是更新数据的时候他会先把所有的数据返回
这难道也正常吗?

同样的语句换成oracle 就不会,用ado 作业不会,这又正么解释?
 
to wzca:
我现在不是嫌select * from xx的时间慢,事实上我根本没觉着慢。
我是说第一次更新的时候时间慢(2万条左右的纪录,第一次更新大概需要5秒),第二次更新就正常了
难道你们也是这样的吗?
 
可不可以考虑用一下 存储过程 呢?
他在 SQL SERVER 上应该被编译过了,执行会快一些了吧。而且不会传一大堆数据
只按你要求返回结果就可以了。
 
2万条左右的纪录,第一次更新大概需要5秒),第二次更新就正常了
难道你们也是这样的吗?
我想肯定你的程序哪边出错了,一条更新语句怎么可能那么慢
我做那么久程序还没有这样出现过。
多找自己程序的原因
 
to zqs10597249
请试验一下我上面提的2各最简单的例子,看看会不会阿。
你是怎么修改数据的?不会出现我说的情况吗?
 
是不是连接惹的祸?
 
2.放入2个query,2个query的requestlive 都设成false, 然后其中一个的sql.写入'select * from xx'
后open, 另一个写入update xx set .. where ..,运行程序,执行query2的update,
你再看sql monitor 是不是也fetch了所有数据?

去掉一个SELECT 的QUERY,你再试UPDATE,不是就知道是不是UPDATE的问题了吗!
 
to huawdg:
我知道去掉一个query直接用时可以的,可我现在必须要有一个联着呢?
比如我说的第一个例子,那种情况下,难道都是要返回的吗?
你别说只要有一个连着就不行,那bde的策略也太差了点了吧。
同样的用oracle, 或ado就不会这样。
 
除非你的SELECT 的QUERY进行刷新了,否则是不可能的!
我刚才也用SQL MONITOR跟踪了,如果你只UPDATE而不刷新,根本没有FETCH
 
to huawdg:
我刚才又做了一遍,绝对没有刷新。
你是用我刚才说的哪个例子做的?
我和你在确认一下
第2个例子:
query1先open,然后query2.execsql
你确定没看到fetch,你有没有把跟踪选项全打开了,如果你连的那个表的容量不大的话,是会很快的。
 
顶部