多線程查詢問題 一個Table 有幾百萬筆數據 , 簡單查詢就要用很長時間 想要用多線程 ,如下語句 select * from table 可以怎樣實現以加快速度 .請教各位 . 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 下面就是一个基本的继承TThread生成的多线程类。 QuerThrd.Pas unit QuerThrd; interface uses Classes,DBTables; type TQueryThread=class(TThread) private fQuery:tQuery; protected procedure Execute;override; public constructorCreate(Suspended:Boolean;Query:TQuery); end; implementation constructor TQueryThread.Create(Suspended:Boolean;Query:TQuery); begin inheritedCreate(Suspended); fQuery:=Query; FreeOnTerminate:=True; end; procedure TQueryThread.Execute; begin fQuery.Open; end; end. 在上面这个简单的例子中,我们构造了一个TThread的子类TQueryThread,用于在后台执行数据库查询。在该类的Create函数中,传递了两个参数Suspended和Query,其中Suspended用于控制线程的运行,如果Suspend为真,TQueryThread类的线程在建立后将立即被悬挂,一直到运行了Resume方法,该线程才会继续执行,Query参数用于接受一个已经存在的Query控件(在窗体中真正的Query控件)而使它在多线程的情况下运行。Execute是最重要的过程,它是类TQueryThread的执行部分,所有需要在这个多线程类中运行的语句都必须写在这个过程里。 实际上构造自己的多线程类时,并不需要输入所有的这些代码,选择DELPHI的File菜单下的new选项,再选“TThreadObject”项目,DELPHI就会为你构造基本的程序模块。然后我们可以根据需要再做相应的修改。 进程的执行: 假设我们已经建立了一个窗体FORM1,窗体中有我们将要使用的查询控件Query1。那么我们在该单元的USES部分加入上面写的QuerThrd单元。 procedure TForm1.Button1Click(Sender:TObject); begin {建立一个运行的进程} TQueryThread.Create(False,Query1); end; 如果这个过程被执行,那么窗体中的查询控件Query1就会自动在多线程的环境下运行查询。注意TQueryThread类中只有Create而没有Free,动态建立类以后又忘记删除是我们常犯的错误之一,不过在这里由于我们指定了FreeOnTerminate(运行完即删除)为真,所以当Execute里的语句执行完后,TQueryThread类占据的内存控件将被自动释放。 然而还有一个问题值得我们注意,由于同一时刻可以有多个线程同时运行,那么我们还必须解决好同步的问题,如果几个多线程程序之间没有任何关联,那么它们之间也不会有任何冲突。但实际上,可能同时运行几个多线程的数据库应用程序,由于需要共享相同的数据库资源,我们还需要为Query1增加一个Tsession控件。 给你一段代码interfaceuses Classes,messages,ADODB,DB,SysUtils,Dialogs,ActiveX;type Tmythread = class(TThread) private Fquery:TAdoquery; //查询 FConnection:TAdoconnection; //连接 FDataSource: TDataSource; { 与查询组件相关的数据感知组件 } procedure ConnectDataSource;{ 连接数据查询组件和数据感知组件的方法 } protected procedure Execute; override; public constructor Create(Suspended:Boolean;Query:TAdoQuery;DS:TDataSource); { 线程构造器 } destructor Destroy;override; end;implementationprocedure Tmythread.ConnectDataSource;{ 连接数据查询组件和数据感知组件的方法 }begin FDataSource.dataset:=Fquery;end;constructor Tmythread.Create(Suspended:Boolean;Query:TAdoQuery;DS: TDataSource);begin CoInitialize( nil ); // 这个在线程中是必需的 try Fconnection:=TAdoconnection.create(nil); Fquery:=Query; FDataSource:=DS; Fquery.connection:=Fconnection; with Fconnection do begin LoginPrompt:=False; KeepConnection:=True; ConnectionString:='Provider=MSDASQL.1;Persist Security Info=False;Data Source=honesty'; end; inherited Create(Suspended); except on E: Exception do begin showmessage('创建线程时出错!错误是:'+ E.Message ); end; end;end;destructor Tmythread.Destroy;begin Fconnection.free; //释放 CoUnInitialize; inherited Destroy;end;procedure Tmythread.Execute;begin try FreeOnTerminate := true; FQuery.Open; { 打开查询 } Synchronize(ConnectDataSource); { 线程同步 } except showmessage('线程异常!'); {线程异常 } end;end;end. >>一個Table 有幾百萬筆數據 , 簡單查詢就要用很長時間思路有问题应该每次返回几十百多记录才合理,你每次都是 select * from table, 说明你的设计很有问题,在这种多数据记录的条件下 DELPHI 做的小程序调用ASP 如何在视图里加入一个不存在的是否字段 如何用Timage处理非位图啊 哪儿有免费的MySQL下载?现在最搞版本到了几点几? 怎样读取指纹仪中的信息? 求个字符串算法 字串思路理清楚了,请看! 一个delphi编程的问题? 浪人 来拿分呀! 不知有没有哪位大虾知道,聊天室里给自己加管理员帽子是怎么一回事? 向某一应用程序的文本框输入文本: 如QQ消息发送框 form 半透明
unit QuerThrd;
interface
uses
Classes,DBTables; type
TQueryThread=class(TThread)
private
fQuery:tQuery;
protected
procedure Execute;override;
public
constructorCreate(Suspended:Boolean;Query:TQuery);
end; implementation
constructor
TQueryThread.Create(Suspended:Boolean;Query:TQuery);
begin
inheritedCreate(Suspended);
fQuery:=Query;
FreeOnTerminate:=True;
end; procedure TQueryThread.Execute;
begin
fQuery.Open;
end;
end. 在上面这个简单的例子中,我们构造了一个TThread的子类TQueryThread,用于在后台执行数据库查询。在该类的Create函数中,传递了两个参数Suspended和Query,其中Suspended用于控制线程的运行,如果Suspend为真,TQueryThread类的线程在建立后将立即被悬挂,一直到运行了Resume方法,该线程才会继续执行,Query参数用于接受一个已经存在的Query控件(在窗体中真正的Query控件)而使它在多线程的情况下运行。Execute是最重要的过程,它是类TQueryThread的执行部分,所有需要在这个多线程类中运行的语句都必须写在这个过程里。
实际上构造自己的多线程类时,并不需要输入所有的这些代码,选择DELPHI的File菜单下的new选项,再选“TThreadObject”项目,DELPHI就会为你构造基本的程序模块。然后我们可以根据需要再做相应的修改。
进程的执行:
假设我们已经建立了一个窗体FORM1,窗体中有我们将要使用的查询控件Query1。那么我们在该单元的USES部分加入上面写的QuerThrd单元。 procedure TForm1.Button1Click(Sender:TObject);
begin
{建立一个运行的进程}
TQueryThread.Create(False,Query1);
end; 如果这个过程被执行,那么窗体中的查询控件Query1就会自动在多线程的环境下运行查询。注意TQueryThread类中只有Create而没有Free,动态建立类以后又忘记删除是我们常犯的错误之一,不过在这里由于我们指定了FreeOnTerminate(运行完即删除)为真,所以当Execute里的语句执行完后,TQueryThread类占据的内存控件将被自动释放。
然而还有一个问题值得我们注意,由于同一时刻可以有多个线程同时运行,那么我们还必须解决好同步的问题,如果几个多线程程序之间没有任何关联,那么它们之间也不会有任何冲突。但实际上,可能同时运行几个多线程的数据库应用程序,由于需要共享相同的数据库资源,我们还需要为Query1增加一个Tsession控件。
interfaceuses
Classes,messages,ADODB,DB,SysUtils,Dialogs,ActiveX;type
Tmythread = class(TThread)
private
Fquery:TAdoquery; //查询
FConnection:TAdoconnection; //连接
FDataSource: TDataSource; { 与查询组件相关的数据感知组件 }
procedure ConnectDataSource;{ 连接数据查询组件和数据感知组件的方法 }
protected
procedure Execute; override;
public
constructor Create(Suspended:Boolean;Query:TAdoQuery;DS:TDataSource); { 线程构造器 }
destructor Destroy;override;
end;implementation
procedure Tmythread.ConnectDataSource;{ 连接数据查询组件和数据感知组件的方法 }
begin
FDataSource.dataset:=Fquery;
end;
constructor Tmythread.Create(Suspended:Boolean;Query:TAdoQuery;DS: TDataSource);
begin
CoInitialize( nil ); // 这个在线程中是必需的
try
Fconnection:=TAdoconnection.create(nil);
Fquery:=Query;
FDataSource:=DS;
Fquery.connection:=Fconnection;
with Fconnection do
begin
LoginPrompt:=False;
KeepConnection:=True;
ConnectionString:='Provider=MSDASQL.1;Persist Security Info=False;Data Source=honesty';
end;
inherited Create(Suspended);
except
on E: Exception do
begin
showmessage('创建线程时出错!错误是:'+ E.Message );
end;
end;
end;
destructor Tmythread.Destroy;
begin
Fconnection.free; //释放
CoUnInitialize;
inherited Destroy;
end;
procedure Tmythread.Execute;
begin
try
FreeOnTerminate := true;
FQuery.Open; { 打开查询 }
Synchronize(ConnectDataSource); { 线程同步 }
except
showmessage('线程异常!'); {线程异常 }
end;
end;end.
就要用很長時間思路有问题应该每次返回几十百多记录才合理,
你每次都是 select * from table, 说明你的设计很有问题,在这种多数据记录的条件下