gpt4 book ai didi

performance - Delphi ADO 数据集过滤器

转载 作者:行者123 更新时间:2023-12-03 15:25:16 29 4
gpt4 key购买 nike

在我正在工作中构建的应用程序中,我有一个大型数据库,其中包含一个包含 100,000 多行的“People”表。此外,该表中的条目包含两种类型的数据:父类型和子类型,其中每个子类型条目在特殊的“Child_OF”列中都有其父类型的数据库 ID。

在内存中,两种数据库条目类型都由相应的类“TParent”和“TChild”表示,其中每个父类都有字段“children : TList”。

这是使用 ADO 实现以下目的的最快方法:- 创建 parent 列表并正确分配他们的 child ...

在我看来......人们可以通过以下方式解决这个问题1)从表中批量检索(通过一个sql查询)所有父项,并创建具有空子项列表的父项列表。2)批量检索所有 child ,并为每个 parent 尝试从相应的数据集中找到他/她的 child 。

这是我对程序分配阶段的想法的示例...

procedure assignParentsTheirChildren(parentList: TList<TParent>;
ma_people: TADOTable);
var
i: Integer;
qry: TADOQuery;
aChild: TChild;
aParent: TParent;
begin

// create the query
qry := TADOQuery.Create(nil);
qry.Connection := ma_people.Connection;
// set the sql statement to fetch all children ...
qry.SQL.Clear;
qry.SQL.Add('Select * from ' + ma_people.TableName + ' WHERE ChildOF <> ' +
QuotedStr(''));
// supposedly do some optimization---
qry.CursorLocation := clUseClient; // load whole recordset in memory
qry.DisableControls;
// disable controls ensures that no dataset bound control will be updated while iterating the recordset
qry.CursorType := ctStatic; // set cursor to static
// open dataset
qry.Open;
// ***EDIT*** for completeness I add the suggestion made by Agustin Seifert below
qry.RecordSet.Fields['ChildOf'].Properties.Item['Optimize'].value := true;

for i := 0 to parentList.count - 1 do
begin
// get daddy
aParent := parentList[i];

qry.Filter := 'ChildOF = ' + QuotedStr(IntToStr(aParent.parentID));
qry.Filtered := true;

while (not qry.EOF) do
begin
aChild := TChild.Create;
getChildFromQuery(aChild, qry); // fills in the fields of TChild class...
aParent.children.Add(aChild);
qry.Next;
end;

end;
qry.Free;
end;

我猜上述代码的最大瓶颈是我正在过滤每个新父级的数据。使用seek() 或locate/find... 是否有更快的返工?基本上可以假设我的数据集是静态的(在创建父级列表期间)并且网络延迟无限:)(也就是说,我首先想从内存中进行子级到父级的分配)。非常感谢!

顺便说一句,我正在使用 Microsoft SQL Server 2012。

最佳答案

如果您不想更改代码/逻辑,有一种方法可以优化 ADO 中的过滤、查找、排序操作。访问记录集并优化涉及的字段:

var
qry: TADOQuery;
rs: _Recordset;
...
begin
...
//after qry.Open;
rs := qry.Recordset;
rs.Fields['YourField'].Properties.Item['Optimize'].Value := True; //YourField = ChildOF in your case

这将为该字段创建一个索引。与在没有索引的情况下多次过滤所需的时间相比,它花费的时间很少。

msdn: Optimize Property-Dynamic (ADO)

关于performance - Delphi ADO 数据集过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22665255/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com