使用由另一个 TListView 触发的 TFDQuery 作为 FireDAC 中的参数将数据填充到 TListView 的最有效方法是什么

What is the most efficient way to populate data to TListView using TFDQuery triggered by another TListView on selected item as parameter in FireDAC

我的数据库 table 中有一百万条记录指向我的 FDQuery。这是我的 SQL 查询:

SELECT DISTINCT variant FROM item_var
JOIN item ON item_var.item_id = item.list_id
WHERE item.brand = :itemselected
ORDER BY variant                              //I did not put a limit because the data here very limited say maximum  10 only

参数“:itemselected”将被我的TListView1选择的项目触发。

此查询的结果将填充到我的 TListView2 中,代码如下:

if dmMain_u.dmMain.qryVariant.RecordCount >= 0 then
  begin
    with dmMain_u.dmMain do
    begin
      qryVariant.Active := False;
      qryVariant.Params.ParamByName('itemselected').AsString := lsvItems.Items[lsvItems.ItemIndex].Text;
      qryVariant.Active := True;
    end;
  end;

我正在为 TListViews 使用实时绑定,我的数据库是 SQLite 嵌入式本地。

上面的代码似乎需要一段时间才能将数据填充到我的 TListView2(大约 5 秒)。我希望你们有更好的选择来分享。也许,我的代码不够高效或不够优化。

数据库设计的一般规则是,任何用于访问数据库行(查找行和将 table 连接在一起)的列都应该被索引。这样服务器(或 Sqllite 中的服务器进程)可以找到相关行,而不必检查 table(也称为 'table scan')中的所有行,这可能会非常低效table 中只有一小部分行与手头任务的要求相关(即匹配)。如果没有 suitable 索引,可能会像您所询问的那样出现性能问题。

大多数数据库引擎,包括一个 'query optimiser',它试图找到执行查询的最有效方法,他们使用的主要策略之一是使用针对 [=涉及 22=](s),因为这可以大大减少需要从 table 中读取的行数。在某些情况下,称为 'covered queries',数据库引擎甚至根本不需要读取 table 行,因为它可以检索它需要的所有信息(包括查询请求的列数据) ) 来自 table.

上的索引

本文'Covering indices'1.7节专门针对Sqlite进行了说明:sqlite.org/queryplanner.html