请教,是不是sql设置得不对? ( 积分: 50 )

  • 主题发起人 主题发起人 yedixifeng
  • 开始时间 开始时间
Y

yedixifeng

Unregistered / Unconfirmed
GUEST, unregistred user!
做了一个软件,用的是access,开始运行得不错,但随着数据添加越来越多,运行十分缓慢,已经有十万数据在里面了。以为改变用sql应该速度能提起来,结果速度一样。请教,是不是sql设置得不对?
 
加索引啊。
 
加索引?不明白。能不能说得详细一点?
 
十万不多啊。自己优化SQL语句才是王道!
 
关于索引你可以查SQL帮助,很详细。
另外shadowpj大侠说的也有道理,必竟索引是有代价的加快sql查询速度。
 
主要代码如下。帮忙看看不合理的地方,谢谢。

procedure TForm1.SavePicture(ParentIDD: Integer; node: TTreeNode; //保存图片
fn: string);
var
query:TADOQuery;
begin
query:=TADOquery.Create(self);
try
with query do
begin
Connection:=ADOConnection1;
close;
sql.Clear;
sql.Add('select * from zhiyuan');
open;
Append;
FieldByName('IDD').AsInteger:=nodeData(node.Data).idd;
FieldByName('PID').AsInteger:=ParentIDD ;
FieldByName('FName').AsString:=nodeData(node.Data).caption;
FieldByName('Ext').AsString:=LowerCase(ExtractFileExt(fn));
FieldByName('Folder').AsInteger:=0;
FieldByName('BMark').AsBoolean:=false;
FieldByName('Pass').AsString:='';
FieldByName('路径一').AsString:=copy(fn,length(extractfilepath(copy(fn,1,LastDelimiter('/',fn)-1)))+1,length(fn));
FieldByName('路径二').AsString:=Edit9.text;
FieldByName('路径三').AsString:=Edit9.text;
FieldByName('系统类别').AsInteger:=nodeData(node.Data).idd;
FieldByName('违章车号').AsInteger:=nodeData(node.Data).idd;
FieldByName('系统编码').AsString:=Edit1.text;
FieldByName('通知书编号').AsString:=Edit2.text;
FieldByName('违章车型').AsString:=Edit3.text;
FieldByName('处理结果').AsString:=Edit4.text;
FieldByName('处罚种类').AsString:=Edit5.text;
FieldByName('发案方式').AsString:=Edit6.text;
FieldByName('违章时间').AsString:=Edit7.text;
FieldByName('编辑输入').AsString:=Edit8.text;
FieldByName('违章车号1').AsString:=Edit10.text;
Post;
end;
finally
query.Free;
end;
end;

procedure TForm1.AddPicMenuClick(Sender: TObject);
var
i :integer;
PNode :NodeData;
Node :TTreeNode;
NodeCaption:string;
begin
if PageControl1.ActivePage<>TreeTab then PageControl1.ActivePage:=TreeTab;
if Treeview1.Selected=nil then begin
messagedlg('必须先选择一个目录,以便添加图片!',mtError,[mbOK],0);
Exit;
end;
if TreeView1.Selected.ImageIndex=0 then
TreeView1.Selected.Parent.Selected:=true;

Node:=nil;
OpenPictureDialog1.Title:='添加图片:';
openpictureDialog1.Options:=[ofHideReadOnly,ofAllowMultiSelect,ofPathMustExist,ofFileMustExist,ofEnableSizing,ofDontAddToRecent,ofForceShowHidden];
if not openpicturedialog1.Execute then exit;
AviForm:=TAviForm.Create(self);
AviForm.Caption:='正在添加图片,请等待...';
AviForm.Label1.Caption:='';
aviform.Label1.Visible:=true;
AviForm.Button1.Enabled:=True;
AviForm.stop:=false;
AviForm.Animate1.CommonAVI:=aviCopyFiles;
AviForm.Animate1.Active:=True;
AviForm.Show;
Screen.Cursor:=crHourGlass;
TreeView1.Items.BeginUpdate;
Try
for i:=0 to OpenPictureDialog1.Files.Count-1 do
begin
application.ProcessMessages;
if AviForm.stop then break;
NodeCaption:=ExtractFileName(OpenPictureDialog1.Files.Strings);
AviForm.Label1.Caption:=NodeCaption;
NodeCaption:=Copy(NodeCaption,1,length(NodeCaption)-4);
new(PNode);
PNode.idd:=GetMaxIDD+1;
PNode.caption:=NodeCaption;
Pnode.Password:='';
Node:=TreeView1.Items.AddChildObject(TreeView1.Selected,NodeCaption,PNode);
Node.SelectedIndex:=0;
Node.ImageIndex:=0;
SavePicture(NodeData(Node.Parent.Data).idd,Node,OpenPictureDialog1.Files.Strings);
end;
Node.Selected:=True;
//showPic(NodeData(Node.Data).idd);
finally
TreeView1.Items.EndUpdate;
AviForm.Close;
AviForm.Free;
Screen.Cursor:=crDefault;
end;
Statusbar1.Panels[2].Text:=intToStr(GetPicOrFolderCount(1));
Statusbar1.Panels[4].Text:=intToStr(GetPicOrFolderCount(0));
end;
 
这是一段批量录入图片,图片采用相对路径。现在录入一张得半分钟,速度太慢了。最开始没有多少数据时,用access时,一张录入也就一两秒。
 
Access 存储10万条有图片的记录已经快到顶了。
我们公司给客户做的客户端软件,也要存入图片的(但不是每条数据都有),
我们在理论上设计也只有10万条数据,再多怕引起数据的丢失。
还是换数据库吧,如果造成数据丢失。你就后悔了。
把Access改为SQLServer改动不是特别大。
 
草原骏马,已经换成了Microsoft SQL Server 2000,速度起不来。
 
表有主键,本身就加了索引,还是优化你的SQL语句吧...
 
代码写的没有效率
1、每次SavePicture都打开表(因为你是循环写入的)
2、在.SavePicture里你打开表时是取所有的数据回来,如果只做写数据是不用取回数据的。
 
谢谢holyszq,你说有道理,一下明白了一点。我试试。
 
sql.Clear;
sql.Add('select * from zhiyuan');
open;

可以改为:
sql.Clear;
sql.Add('select * from zhiyuan where 1<>1'); //这样只有数据结构没有数据

其实你的保存数据完全可以用存储过程来做,程序中调用存储过程,这样更合理些
open;
 
后退
顶部