怎么加快查询速度呀? 我用Ado + Sql server作一个医院的管理系统,但是当我选择药品的时候总是很慢(库中的数据大概5千多条吧)为什么?请尽快解决,高分的,真的能解决问题的话300分加上这100分呀 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 仅仅说ADO+SQL SERVER这样没有问题的,我的数据有几十万条,查询起来也很快。速度慢的原因有以下几点,你看是不是你的也有这样:1、硬件,硬件的配置较低,尤其是内存和CPU,我见过有人这样统计过,就是当SQL SERVER的使用内存达到250M左右的时候,速度会明显下降。我没有试过,因为我的程序的客户端没有那么多。2、使用存储过程、触发器较多。尤其是触发器。你先要了解一下触发器的原理,就是当记录改变时触发。当执行完触发器的内容时才再次执行以下的内容。所以触发器如果太多,是影响速度的主要原因。3、编写程序的优化性。如果一个程序在使用数据库和数据库相连的时候,当你的控件使用完以后一定要关闭,要不然跟数据库一直常连状态,也会是影响速度原因。以上就是我使用的过程中发现的问题。一般情况下影响速度的就是以上几种。 就是这么一段代码,看看怎么帮我优化一下if OperType = 'InMZSF' then with DM.AdoQuery_YPQuery do begin //------- -----------------------------分类给数据--------------------------- with DM.AdoQuery_Tmp do begin close; sql.clear; sql.add('select * from MZSF_Mx'); sql.add('where JZCode = :JZCode and YP_Name = :YP_Name and YPPH = :YPPH'); parameters.ParamByName('JZcode').value := Frm_InMZSF.MaxCode; parameters.ParamByName('YP_Name').Value := DM.ADOQuery_YPQuery.FieldValues['FK_ypName']; Parameters.ParamByName('YPPH').Value := DM.AdoQuery_YPQuery.fieldvalues['YPPH']; open; if Recordcount > 0 then begin Application.MessageBox('选择的药品有重复,请检查!','提示',MB_ICONWarning + MB_OK); exit; end; end; if DM.ADOQuery_YPQuery.FieldValues['FK_YPSL'] > 0 then //判断库存中是否有存货 with DM.adoQuery_InMZSF do begin close; sql.clear; sql.add('select * from Mzsf_mx'); open; insert; fieldbyname('JZCode').value := Frm_InMZSF.MaxCode; fieldbyname('YPBillCode').value :=DM.ADOQuery_YPQuery.FieldValues['YP_BillCode']; fieldbyname('YPCode').value :=DM.ADOQuery_YPQuery.FieldValues['YP_PhyCode']; fieldbyname('yp_Name').value :=DM.ADOQuery_YPQuery.FieldValues['FK_ypName']; fieldByName('YP_DW').Value := DM.ADOQuery_YPQuery.fieldValues['FK_YPDW']; fieldbyname('yp_Spell').value := DM.ADOQuery_YPQuery.FieldValues['FK_ypJM']; fieldbyname('yp_GG').value := DM.ADOQuery_YPQuery.FieldValues['FK_ypGG']; if RYLB <> '公用' then fieldbyname('yp_DJ').value := DM.ADOQuery_YPQuery.FieldValues['YK_YPOutPrice'] else if RYLB = '公用' then fieldbyname('yp_DJ').value := DM.ADOQuery_YPQuery.FieldValues['FK_YPInprice']; fieldByName('YP_SL').Value := DM.ADOQuery_YPQuery.FieldValues['FK_YPSL']; fieldByName('MZSFType').Value := '药费'; fieldbyname('SumJE').value := DM.ADOQuery_YPQuery.FieldValues['YK_YPOutPrice'] * DM.ADOQuery_YPQuery.FieldValues['FK_YPSL']; fieldbyname('YPPH').Value := DM.adoquery_YPQuery.FieldValues['YPPH']; fieldbyname('YP_Inprice').Value := DM.AdoQuery_YPQuery.FieldValues['FK_YPInprice']; post; end else exit; end; if OperType = 'OutMZSF' then begin with DM.AdoQuery_Tmp do begin close; sql.clear; sql.add('select * from MZSF_Mx'); sql.add('where JZCode = :JZCode and YP_Name = :YP_Name and YPPH = :YPPH'); parameters.ParamByName('JZcode').value := Frm_OutMZSF.MaxCode; parameters.ParamByName('YP_Name').Value := DM.ADOQuery_YPQuery.FieldValues['FK_ypName']; parameters.ParamByName('YPPH').Value := DM.ADOQuery_YPQuery.FieldValues['YPPH']; open; if Recordcount > 0 then begin Application.MessageBox('选择的药品有重复,请检查!','提示',MB_ICONWarning + MB_OK); exit; end; end; if DM.ADOQuery_YPQuery.FieldValues['FK_YPSL'] > 0 then //判断库存中是否有存货 begin with DM.adoQuery_OutMZSF do begin close; sql.clear; sql.add('select * from Mzsf_mx'); open; Insert; fieldbyname('JZCode').value := Frm_OutMZSF.MaxCode; fieldbyname('YPBillCode').value :=DM.ADOQuery_YPQuery.FieldValues['YP_BillCode']; fieldbyname('YPCode').value :=DM.ADOQuery_YPQuery.FieldValues['YP_PhyCode']; fieldbyname('yp_Name').value :=DM.ADOQuery_YPQuery.FieldValues['FK_ypName']; fieldByName('YP_DW').Value := DM.ADOQuery_YPQuery.fieldValues['FK_YPDW']; fieldbyname('yp_Spell').value := DM.ADOQuery_YPQuery.FieldValues['FK_ypJM']; fieldbyname('yp_GG').value := DM.ADOQuery_YPQuery.FieldValues['FK_ypGG']; fieldbyname('yp_DJ').value := DM.ADOQuery_YPQuery.FieldValues['YK_YPOutPrice'] * Frm_OutMZSF.TJBL; fieldByName('YP_SL').Value := DM.ADOQuery_YPQuery.FieldValues['FK_YPSL']; fieldByName('MZSFType').Value := '药费'; fieldbyname('SumJE').value := DM.ADOQuery_YPQuery.FieldValues['YK_YPOutPrice'] * DM.ADOQuery_YPQuery.FieldValues['FK_YPSL']; fieldbyname('YPPH').Value := DM.adoquery_YPQuery.FieldValues['YPPH']; post; end; end; end; if OperType = 'LLYY' then begin with DM.AdoQuery_Tmp do begin close; sql.clear; sql.add('select * from llMZSF_Mx'); sql.add('where JZCode = :JZCode and YP_Name = :YP_Name and yp_GG = :YP_GG'); parameters.ParamByName('JZcode').value := StrToInt(Frm_LLYY.Edit_code.text); parameters.ParamByName('YP_Name').Value := DM.ADOQuery_YPQuery.FieldValues['FK_ypName']; parameters.ParamByName('YP_GG').Value := DM.ADOQuery_YPQuery.FieldValues['FK_ypGG']; open; if Recordcount > 0 then begin Application.MessageBox('选择的药品有重复,请检查!','提示',MB_ICONWarning + MB_OK); exit; end; end; with DM.adoQuery_LLYY do begin close; sql.clear; sql.add('select * from LLMzsf_mx'); open; Insert; fieldbyname('JZCode').value := StrToInt(Frm_LLYY.Edit_Code.text); fieldbyname('YPBillCode').value :=DM.ADOQuery_YPQuery.FieldValues['YP_BillCode']; fieldbyname('YPCode').value :=DM.ADOQuery_YPQuery.FieldValues['YP_PhyCode']; fieldbyname('yp_Name').value :=DM.ADOQuery_YPQuery.FieldValues['FK_ypName']; fieldByName('YP_DW').Value := DM.ADOQuery_YPQuery.fieldValues['FK_YPDW']; fieldbyname('yp_Spell').value := DM.ADOQuery_YPQuery.FieldValues['FK_ypJM']; fieldbyname('yp_GG').value := DM.ADOQuery_YPQuery.FieldValues['FK_ypGG']; fieldbyname('yp_DJ').value := DM.ADOQuery_YPQuery.FieldValues['YK_YPOutPrice']; fieldByName('YP_SL').Value := DM.ADOQuery_YPQuery.FieldValues['FK_YPSL']; fieldByName('LLMZSFType').Value := '药费'; fieldbyname('SumJE').value := DM.ADOQuery_YPQuery.FieldValues['YK_YPOutPrice'] * DM.ADOQuery_YPQuery.FieldValues['FK_YPSL']; post; end; end; finally Frm_YPQuery.close; end; try DisableControls 查询 ...finally EnableControls 对付SQLSERVER查询速度,最有效的方法就是用其带的事件探查器,跟踪执行过程,找到在那条语句上,执行速度较慢,再分析原因(一般是由于表太大,或者是视图级数太多),然后确定SQL语句中的条件句,尽量减小数据集中记录的个数(包括视图)。要是SQL语句的执行速度并不慢,那就去审查并调或重新设计自己的算法或处理过程. 当然慢了!你的代码写的太笨了,用一些技巧会好的,其实用不了这么多代码的,第一个Part你只是想知有没有数据,应该用Count在SQL里写你把所有列都SELECT了,能不慢吗?在SELECT时最好不要用如“SELECT * FROM”类似的语句只SELECT需要的列就可以了。不过这些不是慢的根本原因,但如果这类代码多了会明显慢的!!! 小弟的解决方法:你把要执行的SQL语句都直接在SQL SERVER上执行,如果也慢。说明机器太弱了。如果直接在SQLSERVER上运行不慢的话(一般没问题才5000条呀!大哥!这是一个多么小的库呀!)那么你的代码一定有问题。我估计你的代码问题,可能是主要原因。因为SQLSERVER查询速度不慢。特别是仅有5000条呀!楼上几位同志们的办法你也可以用上,比如加disablecontrols.但我的意见是你的代码不行呀。有点外H. 我呢,完完全全用SQL语句来实现,几十万条记录,也还行的,你的连外连接都没有,应该不会,你们是多少M的网卡?服务器是什么样的? 1。你的表MZSF_Mx 上要建立索引,字段JZCode,YP_Name YPPH,2。你向Mzsf_mx及其它表插入新记录的时候不要用你的那方法(先把整个表打开再EDIT),建议你用SQL语句Insert into 来实现 lihao_ningxia(耗子) 我现在还没有用网络版的呢,我现在只是先用单机作试验呢belllab(菜鸟) 你说的方法我会试一下的 是不是由于我的Win2k是sp3的,别人的不是的缘故呢,和Ado的版本有关吗? 请教高手delphi的编译出错问题! ◆◆【散分】祝 白雪公猪 生日快乐◆◆ 用fast Repart 如何实现这种分栏分组效果 急:用哪个函数可以把某变量后面的空字符串去掉? @@@@@@@@@@@2如何给LISTVIEW某个节点置为焦点 也就是选中状态 @@@@@@@@@@@@@@@ 用indy9控件写聊天程序,信息发送问题 隐藏dos窗口 能否不设置odbc,直接访问access2000文件 !!!怎样用GSM模块(手机modem)发中文短讯,英文的我已实现。 小問題,請辦忙! 散分! dbgrid中用回车键代替Tab键
速度慢的原因有以下几点,你看是不是你的也有这样:
1、硬件,硬件的配置较低,尤其是内存和CPU,我见过有人这样统计过,就是当SQL SERVER的使用内存达到250M左右的时候,速度会明显下降。我没有试过,因为我的程序的客户端没有那么多。
2、使用存储过程、触发器较多。尤其是触发器。你先要了解一下触发器的原理,就是当记录改变时触发。当执行完触发器的内容时才再次执行以下的内容。所以触发器如果太多,是影响速度的主要原因。
3、编写程序的优化性。如果一个程序在使用数据库和数据库相连的时候,当你的控件使用完以后一定要关闭,要不然跟数据库一直常连状态,也会是影响速度原因。以上就是我使用的过程中发现的问题。一般情况下影响速度的就是以上几种。
with DM.AdoQuery_YPQuery do
begin
//------- -----------------------------分类给数据---------------------------
with DM.AdoQuery_Tmp do
begin
close;
sql.clear;
sql.add('select * from MZSF_Mx');
sql.add('where JZCode = :JZCode and YP_Name = :YP_Name and YPPH = :YPPH');
parameters.ParamByName('JZcode').value := Frm_InMZSF.MaxCode;
parameters.ParamByName('YP_Name').Value := DM.ADOQuery_YPQuery.FieldValues['FK_ypName'];
Parameters.ParamByName('YPPH').Value := DM.AdoQuery_YPQuery.fieldvalues['YPPH'];
open;
if Recordcount > 0 then
begin
Application.MessageBox('选择的药品有重复,请检查!','提示',MB_ICONWarning + MB_OK);
exit;
end;
end;
if DM.ADOQuery_YPQuery.FieldValues['FK_YPSL'] > 0 then //判断库存中是否有存货
with DM.adoQuery_InMZSF do
begin
close;
sql.clear;
sql.add('select * from Mzsf_mx');
open;
insert;
fieldbyname('JZCode').value := Frm_InMZSF.MaxCode;
fieldbyname('YPBillCode').value :=DM.ADOQuery_YPQuery.FieldValues['YP_BillCode'];
fieldbyname('YPCode').value :=DM.ADOQuery_YPQuery.FieldValues['YP_PhyCode'];
fieldbyname('yp_Name').value :=DM.ADOQuery_YPQuery.FieldValues['FK_ypName'];
fieldByName('YP_DW').Value := DM.ADOQuery_YPQuery.fieldValues['FK_YPDW'];
fieldbyname('yp_Spell').value := DM.ADOQuery_YPQuery.FieldValues['FK_ypJM'];
fieldbyname('yp_GG').value := DM.ADOQuery_YPQuery.FieldValues['FK_ypGG'];
if RYLB <> '公用' then
fieldbyname('yp_DJ').value := DM.ADOQuery_YPQuery.FieldValues['YK_YPOutPrice']
else
if RYLB = '公用' then
fieldbyname('yp_DJ').value := DM.ADOQuery_YPQuery.FieldValues['FK_YPInprice'];
fieldByName('YP_SL').Value := DM.ADOQuery_YPQuery.FieldValues['FK_YPSL'];
fieldByName('MZSFType').Value := '药费';
fieldbyname('SumJE').value := DM.ADOQuery_YPQuery.FieldValues['YK_YPOutPrice'] * DM.ADOQuery_YPQuery.FieldValues['FK_YPSL'];
fieldbyname('YPPH').Value := DM.adoquery_YPQuery.FieldValues['YPPH'];
fieldbyname('YP_Inprice').Value := DM.AdoQuery_YPQuery.FieldValues['FK_YPInprice'];
post;
end
else
exit;
end;
if OperType = 'OutMZSF' then
begin
with DM.AdoQuery_Tmp do
begin
close;
sql.clear;
sql.add('select * from MZSF_Mx');
sql.add('where JZCode = :JZCode and YP_Name = :YP_Name and YPPH = :YPPH');
parameters.ParamByName('JZcode').value := Frm_OutMZSF.MaxCode;
parameters.ParamByName('YP_Name').Value := DM.ADOQuery_YPQuery.FieldValues['FK_ypName'];
parameters.ParamByName('YPPH').Value := DM.ADOQuery_YPQuery.FieldValues['YPPH'];
open;
if Recordcount > 0 then
begin
Application.MessageBox('选择的药品有重复,请检查!','提示',MB_ICONWarning + MB_OK);
exit;
end;
end;
if DM.ADOQuery_YPQuery.FieldValues['FK_YPSL'] > 0 then //判断库存中是否有存货
begin
with DM.adoQuery_OutMZSF do
begin
close;
sql.clear;
sql.add('select * from Mzsf_mx');
open;
Insert;
fieldbyname('JZCode').value := Frm_OutMZSF.MaxCode;
fieldbyname('YPBillCode').value :=DM.ADOQuery_YPQuery.FieldValues['YP_BillCode'];
fieldbyname('YPCode').value :=DM.ADOQuery_YPQuery.FieldValues['YP_PhyCode'];
fieldbyname('yp_Name').value :=DM.ADOQuery_YPQuery.FieldValues['FK_ypName'];
fieldByName('YP_DW').Value := DM.ADOQuery_YPQuery.fieldValues['FK_YPDW'];
fieldbyname('yp_Spell').value := DM.ADOQuery_YPQuery.FieldValues['FK_ypJM'];
fieldbyname('yp_GG').value := DM.ADOQuery_YPQuery.FieldValues['FK_ypGG'];
fieldbyname('yp_DJ').value := DM.ADOQuery_YPQuery.FieldValues['YK_YPOutPrice'] * Frm_OutMZSF.TJBL;
fieldByName('YP_SL').Value := DM.ADOQuery_YPQuery.FieldValues['FK_YPSL'];
fieldByName('MZSFType').Value := '药费';
fieldbyname('SumJE').value := DM.ADOQuery_YPQuery.FieldValues['YK_YPOutPrice'] * DM.ADOQuery_YPQuery.FieldValues['FK_YPSL'];
fieldbyname('YPPH').Value := DM.adoquery_YPQuery.FieldValues['YPPH'];
post;
end;
end;
end;
if OperType = 'LLYY' then
begin
with DM.AdoQuery_Tmp do
begin
close;
sql.clear;
sql.add('select * from llMZSF_Mx');
sql.add('where JZCode = :JZCode and YP_Name = :YP_Name and yp_GG = :YP_GG');
parameters.ParamByName('JZcode').value := StrToInt(Frm_LLYY.Edit_code.text);
parameters.ParamByName('YP_Name').Value := DM.ADOQuery_YPQuery.FieldValues['FK_ypName'];
parameters.ParamByName('YP_GG').Value := DM.ADOQuery_YPQuery.FieldValues['FK_ypGG'];
open;
if Recordcount > 0 then
begin
Application.MessageBox('选择的药品有重复,请检查!','提示',MB_ICONWarning + MB_OK);
exit;
end;
end;
with DM.adoQuery_LLYY do
begin
close;
sql.clear;
sql.add('select * from LLMzsf_mx');
open; Insert;
fieldbyname('JZCode').value := StrToInt(Frm_LLYY.Edit_Code.text);
fieldbyname('YPBillCode').value :=DM.ADOQuery_YPQuery.FieldValues['YP_BillCode'];
fieldbyname('YPCode').value :=DM.ADOQuery_YPQuery.FieldValues['YP_PhyCode'];
fieldbyname('yp_Name').value :=DM.ADOQuery_YPQuery.FieldValues['FK_ypName'];
fieldByName('YP_DW').Value := DM.ADOQuery_YPQuery.fieldValues['FK_YPDW'];
fieldbyname('yp_Spell').value := DM.ADOQuery_YPQuery.FieldValues['FK_ypJM'];
fieldbyname('yp_GG').value := DM.ADOQuery_YPQuery.FieldValues['FK_ypGG'];
fieldbyname('yp_DJ').value := DM.ADOQuery_YPQuery.FieldValues['YK_YPOutPrice'];
fieldByName('YP_SL').Value := DM.ADOQuery_YPQuery.FieldValues['FK_YPSL'];
fieldByName('LLMZSFType').Value := '药费';
fieldbyname('SumJE').value := DM.ADOQuery_YPQuery.FieldValues['YK_YPOutPrice'] * DM.ADOQuery_YPQuery.FieldValues['FK_YPSL'];
post;
end;
end;
finally
Frm_YPQuery.close;
end;
DisableControls
查询
...
finally
EnableControls
你把所有列都SELECT了,能不慢吗?在SELECT时最好不要用如“SELECT * FROM”类似的语句
只SELECT需要的列就可以了。不过这些不是慢的根本原因,但如果这类代码多了会明显慢的!!!
你把要执行的SQL语句都直接在SQL SERVER上执行,如果也慢。说明机器太弱了。如果直接在SQLSERVER上运行不慢的话(一般没问题才5000条呀!大哥!这是一个多么小的库呀!)那么你的代码一定有问题。
我估计你的代码问题,可能是主要原因。因为SQLSERVER查询速度不慢。特别是仅有5000条呀!
楼上几位同志们的办法你也可以用上,比如加disablecontrols.但我的意见是你的代码不行呀。有点外H.
2。你向Mzsf_mx及其它表插入新记录的时候不要用你的那方法(先把整个表打开再EDIT),建议你用SQL语句Insert into 来实现
belllab(菜鸟) 你说的方法我会试一下的