【问题标题】:Selective activation of indexes in FiredacFiredac 中索引的选择性激活
【发布时间】:2017-04-07 07:46:28
【问题描述】:

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

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

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

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

另一方面

一般来说,如果数据集的IndexesActiveTrue,则视图会被维护。

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

【问题讨论】:

    标签: delphi firebird delphi-xe7 firedac


    【解决方案1】:

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

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

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

    我要提到的所有操作都被对 FDQuery1.DisableControls & .EnableControls 的调用以及记录操作所用时间(以毫秒为单位)的代码所包围。

    1. 无论 FDQuery1.IndexesActive 是否预先设置为 True,第一次调用 FDQuery1.Open 大约需要 300 毫秒。调用 .Open 后,FDQuery1.RecordCount 为 50,因此显然此时它还没有检索到整个结果集。
    2. 然后,执行 FDQuery.Last; FDQuery1.First 大约需要 620 毫秒。
    3. 打开 FDQuery1 后将 IndexesActive 设置为 True 大约需要 0 毫秒。
    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步激活索引,耗时约630ms。

    基于上述,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 毫秒。

    【讨论】:

    • 我注意到您在上述情况下使用 FDQuery,您的索引实际上是数据库不维护的“客户端”索引。就我而言,我正在使用 TFDTable 并尝试激活由我的 Firebird 数据库实际创建的索引。
    • @Johny:如果您提到使用 FDTable 的事实会有所帮助,因为您似乎在谈论 FireDAC 索引,而不是服务器端索引。无论如何,如果 FireDAC 数据集可以动态构建自己的索引,那么使用服务器端索引有什么意义呢?
    • @MartnA:在 FireDac 上激活客户端索引比激活服务器端索引消耗更多时间。在具有大约 100 万条记录的表上,激活单个基于数据库的索引需要 1 秒,而在 FireDac 上激活客户端索引需要大约 20 秒。请注意,我正在尝试将基于 BDE 表的应用程序迁移到 FireDac。
    • @Johny:当您打开 FDTable 时,您并没有认真建议您检索所有 100 万条记录给客户端,是吗?无论如何,我放弃了——你正在一个一个地透露你的情况的细节,这些细节一开始就应该在你的 q 中,所以我投票决定关闭它。
    • 放轻松@MartynA,我只是在这里回答你的问题。我没有透露我的案件的整个故事这一事实并没有从我首先提出的原始问题中删除任何内容。无论我实际试图达到什么目标,就索引激活而言,我认为 FireDAC 的行为存在设计矛盾。
    猜你喜欢
    • 1970-01-01
    • 2018-10-24
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多