选择性激活Firedac中的索引

时间:2017-04-07 07:46:28

标签: delphi firebird delphi-xe7 firedac

我在 Delphi XE7 中使用 FireDAC (TFDTable)和 Firebird 数据库,我想激活它们上的现有索引选择性地

我避免将FireDAC属性IndexesActive设置为True,因为后者会立即激活所有现有索引并消耗显着的时间。相反,我试图单独激活某些索引,但徒劳无功。

我注意到,为了激活单个索引,您仍然需要将IndexesActive属性设置为True,这并没有多大意义。我甚至可以在Delphi的帮助文档中注意到这种矛盾,一方面他们说

  

要有选择地启用和禁用数据视图,而不是一次打开或关闭它们,请使用单个Active对象的TFDIndex属性。

另一方面

  

通常,如果数据集的IndexesActiveTrue,则会维护该视图。

有人能指出在FireDAC中单独激活索引的方法吗?

1 个答案:

答案 0 :(得分:1)

  

有人能指出在Firedac中单独激活索引的方法吗?

根据我的观察,我不确定是否有任何意义,因为那里 似乎是另一种最小化延迟激活或在索引之间切换的方法。

我有一个从服务器检索20k 60列行的FDQuery。它有5个已定义的索引并连接到DBGrid。

我要提到的所有操作都被调用FDQuery1.DisableControls& .EnableControls和代码,以毫秒为单位记录操作所需的时间。

  1. 无论FDQuery1.IndexesActive是否事先设置为True,对FDQuery1.Open的第一次调用大约需要300ms。在调用.Open之后,FDQuery1.RecordCount为50,所以很明显它此时还没有检索到整个结果集。
  2. 然后,做FDQuery.Last; FDQuery1.First需要大约620ms。
  3. 打开FDQuery1后,将IndexesActive设置为True需要~0ms。
  4. 然后,按名称激活特定索引

    procedure TForm1.UseIndex(const AName : String);
    var
      Index : TFDIndex;
      T1 : Integer;
    begin
      T1 := GetTickCount;
      FDQuery1.DisableControls;
      Index := FDQuery1.Indexes.IndexByName(AName);
      Index.Active := True;
      FDQuery1.IndexName := AName;
      FDQuery1.EnableControls;
      Caption := IntToStr(GetTickCount - T1);
    end;
    

    需要50到200毫秒,显然取决于排序顺序 数据行与物理(检索)顺序不同。

  5. 重新启动项目并省略第2步,第一次根据步骤4激活索引时,大约需要630毫秒。
  6. 基于以上所述,GUI的响应性似乎通过使用来提高 像这样的代码:

    T1 := GetTickCount;
    FDQuery1.IndexesActive := True;
    FDQuery1.DisableControls;
    FDQuery1.Active := True;
    FDQuery1.First;
    FDQuery1.Last;
    FDQuery1.EnableControls;
    Caption := IntToStr(FDQuery1.RecordCount) + ' ' + IntToStr(GetTickCount - T1);
    

    在表单显示之前。记录的时间大约是1000毫秒,但几乎没有 显而易见,因为表格尚未出现在屏幕上。

    完成后,激活任何一个索引最多需要300毫秒。