代码,从表biao中根据ziduan查找,并返回x1,x2两个值,赋给jieguo1,jieguo2a:='emample';
for i := 1 to 400 do//测试运行400次
begin
ADOQuery1.Close;
ADOQuery1.SQL.Text:='select x1,x2 from biao where ziduan ='''+a+'''';
ADOQuery1.Open; jieguo1:=ADOQuery1.FieldByName('x1').AsString;//这句去掉,对运行时间没啥优化
jieguo2:=ADOQuery1.FieldByName('x2').AsString;//这句去掉,对运行时间没啥优化 end;biao大概有2万条数据,ziduan,x1,x2都是长度不超过5的字符。
测试上面的代码,要运行3秒半。
这个速度实在太慢了,大牛,帮忙看一下如何解决
for i := 1 to 400 do//测试运行400次
begin
ADOQuery1.Close;
ADOQuery1.SQL.Text:='select x1,x2 from biao where ziduan ='''+a+'''';
ADOQuery1.Open; jieguo1:=ADOQuery1.FieldByName('x1').AsString;//这句去掉,对运行时间没啥优化
jieguo2:=ADOQuery1.FieldByName('x2').AsString;//这句去掉,对运行时间没啥优化 end;biao大概有2万条数据,ziduan,x1,x2都是长度不超过5的字符。
测试上面的代码,要运行3秒半。
这个速度实在太慢了,大牛,帮忙看一下如何解决
ADOQuery1.SQL.Text:='select x1,x2 from biao where ziduan ='''+a+'''';
ADOQuery1.Open; jieguo1:=ADOQuery1.FieldByName('x1').AsString;//这句去掉,对运行时间没啥优化
jieguo2:=ADOQuery1.FieldByName('x2').AsString;//这句去掉,对运行时间没啥优化
------------------------------------------
执行一次3秒钟?
for i := 1 to 400 do//测试运行400次
begin
//下面三行为何写在循环里面?一次查出需要的再分别赋值不行吗?
ADOQuery1.Close;
ADOQuery1.SQL.Text:='select x1,x2 from biao where ziduan ='''+a+'''';
ADOQuery1.Open;
jieguo1:=ADOQuery1.FieldByName('x1').AsString;//这句去掉,对运行时间没啥优化
jieguo2:=ADOQuery1.FieldByName('x2').AsString;//这句去掉,对运行时间没啥优化 end;
(实际上,在交给客户的程序中,他输入一个值,要查数据库1200次,我用的就是上面的代码,要大概9秒钟,这个时间太长了)。刚才在access里给“ziduan”建了个索引,速度快了些,运行400次大概1.5秒。
这个时间正常.
建议你调整优化的方向实际应用中, 1200次查询是一次完成的吗?
--------------------------------------
1 用户操作一次, 执行少量查询, 速度延滞不会太大.
2 用户操作一次, 执行多次查询, 先把查询语句拼接好了-> 执行一次查询-> 分配查询结果, 这样就快了
你那里速度慢的地方,一个是频繁的open,close,第二个,就是每次都需要编译、运行sql语句。
如果想要速度快,采用存储过程吧,存储过程只需要传入参数,不需要open,close,也不需要每次都编译语句。
但是access不支持存储过程,想要高性能,采用更好的数据库吧。
你可以这样做:
ADOQuery1.Close;
ADOQuery1.SQL.Text:='select x1,x2 from biao ‘; //我想打开一个2万笔的数据表应该慢不到哪里去吧?
ADOQuery1.Open;a:='emample'; // a 的值需要改变400次,这里就不模拟了,就默认都是这个值
for i := 1 to 400 do//测试运行400次
begin
//查找定位记录
ADOQuery1.locate('ziduan',a,[]); //这条语句就是在内存里找了,不关数据库的事了,所以速度会很快。 //返回需要的结果
jieguo1:=ADOQuery1.FieldByName('x1').AsString;
jieguo2:=ADOQuery1.FieldByName('x2').AsString; end;
事实上,你的select 语句执行后,不是所有的数据都在本地内存的,DEPHI只会把其中的一部分调到内存,觉得楼主在这里钻牛角了。
所以,把所有的数据SELECT回来,然后LOCATE的方法是可行的。没有必要进行400个CLOSE和OPEN。
看一下效率是不是提高了?
对比一下索引前和索引后需要的时间?
最重要的是减轻了服务器的负担,如果楼猪的原本方法,有几个客户端的话,服务器不都把资源浪费在查询中
1、SQL查询的速度,基本上就是如此了。
2、你编写一个函数,将查询的结果存入过度性的DataSet中。
3、此函数定时生成结果。 或在服务器端定时生成。
4、用户读取DataSet中的值。这样,用户感觉非常快了。只是建议而已!
SELECT A.*
FROM Table
WHERE EXISTS(SELECT TOP 1 1 FROM biao);
Exists里面就是你要过滤的条件
原则,尽量一次性把你需要的数据找出来,返回的字段只要你需要的字段,少用IN,或者LIKE '%SSSS'这样的语句。