我在 Delphi XE7 中使用 FireDAC (TFDTable)和 Firebird 数据库,我想激活它们上的现有索引选择性地
我避免将FireDAC属性IndexesActive
设置为True
,因为后者会立即激活所有现有索引并消耗显着的时间。相反,我试图单独激活某些索引,但徒劳无功。
我注意到,为了激活单个索引,您仍然需要将IndexesActive
属性设置为True
,这并没有多大意义。我甚至可以在Delphi的帮助文档中注意到这种矛盾,一方面他们说
要有选择地启用和禁用数据视图,而不是一次打开或关闭它们,请使用单个
Active
对象的TFDIndex
属性。
另一方面
通常,如果数据集的
IndexesActive
为True
,则会维护该视图。
有人能指出在FireDAC中单独激活索引的方法吗?
答案 0 :(得分:1)
有人能指出在Firedac中单独激活索引的方法吗?
根据我的观察,我不确定是否有任何意义,因为那里 似乎是另一种最小化延迟激活或在索引之间切换的方法。
我有一个从服务器检索20k 60列行的FDQuery。它有5个已定义的索引并连接到DBGrid。
我要提到的所有操作都被调用FDQuery1.DisableControls& .EnableControls和代码,以毫秒为单位记录操作所需的时间。
然后,按名称激活特定索引
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毫秒,显然取决于排序顺序 数据行与物理(检索)顺序不同。
基于以上所述,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毫秒。