在线程中
我用BDE和ADO都测试了 为什么有下面的问题
用Table 可以立即更新数据
而用Query 的SQL 却要等几秒才更新成功! 我可能是哪做错了?是用TABLE好还是QUERY好!总感觉SQL方便一些!
我用BDE和ADO都测试了 为什么有下面的问题
用Table 可以立即更新数据
而用Query 的SQL 却要等几秒才更新成功! 我可能是哪做错了?是用TABLE好还是QUERY好!总感觉SQL方便一些!
解决方案 »
- IdUDPClient怎么传输不定长度的Stream?
- 如何让一个控件在执行期间象在设计时一样能够自由的拖动和拉大拉小呢
- 读计算机博士的用处大吗?请读过博士并工作一段时间的或者身边有这样的人的哥们根据亲身经历回答
- 如何获取某个网页页面的内容(在线等待中)
- 这个问题,大家来抢呀。100分呀。
- 异常处理!
- 怎样得到listview里的最后一列的值?谢谢
- 先别浪费分,解决后再新开贴加分,我要问问用什么方法才能知道网络在通信?(具体说明看贴子)
- 怎么在win98下连接sqlserver,怎么办?我用ado
- 求助,急急急!!!
- 在D7中,如何设置,让弹出的窗口,只有用户点击关闭后才没有?
- 新建工程后引入过去工程的单元文件无法正常执行
query1.close;
query1.sql.clear;
query1.sql.Add(sqlstr);
query1.execsql;这是插入语句我尝试不在线程中 做一个循环!
for i:=0 to 10000 do begin
name:='test'+inttostr(i);
sqlstr := 'insert into book values(''' + name + ''',' + inttostr(i) +')';
query1.close;
query1.sql.clear;
query1.sql.Add(sqlstr);
query1.execsql;
end;
结果依旧!10000条记录不是很多吧?
我哪里做错了!帮帮我!郁闷死了。。
name:='test'+inttostr(i);
sqlstr := 'insert into book values(''' + name + ''',' + inttostr(i) +')';
//query1.close;
query1.sql.clear;
query1.sql.Add(sqlstr);
query1.execsql;
end;
试试把query1.close;去掉
这样也可以?
query1.Open;
for i:=0 to 10000 do begin
name:='test'+inttostr(i);
query1.Append;
query1.FieldByName('字段1').AsString := name;
query1.FieldByName('字段2').AsString := inttostr(i);
end;
试试看?
name, sqlstr: string;
begin
with Table1 do begin
active := false;
tablename := 'book';
active := true;
end;
for i := 0 to 30000 do begin
name := 'test' + inttostr(i);
with Table1 do begin
Append;
FieldByName('id').asstring := name;
FieldByName('ddf').asfloat := i;
post;
end;
end;
end;30000条记录转眼就进去了!
估计上面的query1.close;
query1.sql.clear;
query1.sql.Add(sqlstr);
query1.execsql;这段不停的关闭打开占用了时间! 是不是这样?
同意去掉那句query1.close;语句
你实验过吗?好象不可以
如果你看一下TQuery的源代码,就能明白,只要你修改了TQuery.SQL这个属性,TQuery就会自动关闭。
TQuery = class(TDBDataSet)
private
...
property SQL: TStrings read FSQL write SetQuery;
...procedure TQuery.Disconnect;
begin
Close;
UnPrepare;
end;...procedure TQuery.SetQuery(Value: TStrings);
begin
if SQL.Text <> Value.Text then
begin
Disconnect; //*******!!!!!!!!!!!
SQL.BeginUpdate;
try
SQL.Assign(Value);
finally
SQL.EndUpdate;
end;
end;
end;
帖子折腾来折腾去,自己试验一下早就知道了。
query1.Prepared:=true;
我都实验过! 30000条记录要3分钟才进去
<->
for i:=0 to 30000 do begin
name:='test'+inttostr(i);
sqlstr := 'insert into book values(''' + name + ''',' + inttostr(i) +')';
query1.sql.clear;
query1.sql.Add(sqlstr);
query1.execsql;
end;<-->
query1.sql.clear;
for i:=0 to 30000 do begin
name:='test'+inttostr(i);
sqlstr := 'insert into book values(''' + name + ''',' + inttostr(i) +')';
query1.sql.Add(sqlstr);
query1.execsql;
end;
<--->
query1.sql.clear;
for i:=0 to 30000 do begin
name:='test'+inttostr(i);
sqlstr := 'insert into book values(''' + name + ''',' + inttostr(i) +');';
query1.sql.Add(sqlstr);
end;
query1.execsql;
1.你用的什么数据库,paradox还是access;
2.索引怎么建的;
id 字段索引不过 paradox和access我都实验过!怎么也快不了!用Table 在paradox中很快 30000条记录转眼就进去了!
但query怎么弄也不行
数据库: test.mdb
表:book
字段: id 字符
ddf 数字拜托老大给写一个测试一下!
i, t: integer;
sqlstr: string;
begin
Database1.Connected:= true;
query1.sql.clear;
t:= GetTickCount;
for i:=0 to 10000 do begin
name:= 'test' + inttostr(i);
sqlstr:= 'insert into book values(''' + name + ''',' + inttostr(i) +')';
query1.sql.Text:= sqlstr;
query1.execsql;
end;
ShowMessage(IntToStr(GetTickCount-t));
end;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
10000记录 paradox 用了 49.431s Pentium M 1.6G /512M
i, t: integer;
sqlstr: string;
begin
Database1.Connected:= true;
query1.sql.clear;
t:= GetTickCount;
Query1.Sql.Add('insert into book values(:name, :i)');
Query1.Prepare; // 注意这句
for i:=1 to 10000 do begin
Name:= 'test' + inttostr(i);
Query1.ParamByName('name').Value:= Name;
Query1.ParamByName('i').AsFloat:= i;
query1.execsql;
end;
Query1.UnPrepare;
Database1.Close;
ShowMessage(IntToStr(GetTickCount-t));
end;用了 7.13s 不用 注释那句 17.768s
i, t: integer;
sqlstr: string;
begin
Database1.Connected:= true;
Table1.Active:= true;
t:= GetTickCount;
for i:=1 to 10000 do begin
Name:= 'test' + inttostr(i);
Table1.AppendRecord([Name, i]);
end;
Database1.Close;
ShowMessage(IntToStr(GetTickCount-t));
end; 7.41s上面的测试每次我都把表Empty 并 pack了。
楼主在每一次的循环里面,都Clear掉SQL,然后重新赋予一个类似的SQL。这必然是非常耗费时间的操作。
实际上,象尿不湿这样做最好了,用Param来指定。
《一》速度:0.984S
var i,t: integer;
names, sqlstr: string;
begin
t:= GetTickCount;
with Table1 do begin
active := false;
tablename := 'book';
active := true;
end;
for i := 0 to 30000 do begin
names := 'test' + inttostr(i);
with Table1 do begin
Append;
FieldByName('id').asstring := names;
FieldByName('ddf').asfloat := i;
post;
end;
end;
ShowMessage(IntToStr(GetTickCount-t));
end;《二》时间1.531s
var
i, t: integer;
Names,sqlstr: string;
begin
query1.sql.clear;
t:= GetTickCount;
Query1.Sql.Add('insert into book values(:name, :i)');
Query1.Prepare;
for i:=1 to 10000 do begin
Names:= 'test' + inttostr(i);
Query1.ParamByName('name').Value:= Names;
Query1.ParamByName('i').AsFloat:= i;
query1.execsql;
end;
Query1.UnPrepare;
ShowMessage(IntToStr(GetTickCount-t));
end;《三》时间:36.203S
去掉:Query1.Prepare; 不用Table的话估计耙子老大的方法是最好的!衷心感谢!感谢pazee(耙子)及各位!为了让和我一样郁闷过的朋友看到这次讨论。晚上回来接贴!
如果你有更好的方法也希望共享一下!
但空表添加10000条记录 的确如上!
你可以测试一下!
http://community.csdn.net/Expert/topic/3635/3635535.xml?temp=.6966516
table不可能比query快~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
对于本地表比如paradox table肯定比query快,
因为它本身不是sql数据库,是local sql,Table的操作更接近原操作,而sql还要通过解释才行。对于sql数据库,sql是远远快过table的