一個Table 有幾百萬筆數據 , 簡單查詢
就要用很長時間
 
想要用多線程 ,如下語句 select   *   from   table 可以怎樣實現以加快速度 .請教各位 .

解决方案 »

  1.   

    下面就是一个基本的继承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的子类TQueryThread,用于在后台执行数据库查询。在该类的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控件。
      

  2.   

    给你一段代码
    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.
      

  3.   

    >>一個Table 有幾百萬筆數據 , 簡單查詢
    就要用很長時間思路有问题应该每次返回几十百多记录才合理,
    你每次都是 select * from table, 说明你的设计很有问题,在这种多数据记录的条件下