6

我想知道最好的(阅读:最快的)方法是在 Tquery SQL 语句的结果集中找到一条记录。

到目前为止,我使用的是 TQuery.Locate,如果我是对的,那是唯一可用于在结果集中搜索的语句。那么我们该如何优化呢?

我有一些想法,但还没有时间在大型数据集上比较它们:

假设我们有一个包含以下字段的表:

Create Table aTable (
 ID int, 
 Name1 varchar(50), 
 Name2 varchar(50));

以及以下查询:

SELECT ID, Name1, Name2 from aTable

我们想在结果集中通过它的 ID 来定位一条记录

  • 如果 aTable 在 ID 上有索引,定位会更快吗?
  • 如果我在 SQL 语句中添加“Order By ID”,定位会更快吗?

对此有什么想法吗?

[编辑] 澄清其用途:查询由 Reportbuilder 数据视图执行,然后通过数据管道(即 TQuery.Dataset)提供。在自定义报告中,我需要根据一些更高级别的 ID 遍历管道。所以不使用查询在这里不适用。我只是想知道我上面的任何建议是否会加快速度。

4

3 回答 3

4

以下是一些您可能会发现有用的提示

  • 仅在索引列上使用 Locate() 方法
  • 在索引列上使用“order by”
  • 在打开查询之前使用准备
  • 使用 DisableControls / EnableControls
  • 根据您的需要使用升序/降序索引(或两者)
  • 试试FastReports

如果您在大型数据集上有主/详细信息,请不要获取所有详细信息记录 - 换句话说 - 不要使用本地主详细信息 - 让数据库引擎只为您提供所需的记录。

于 2011-08-08T13:24:40.067 回答
1

如果您需要在大型数据集上经常执行此操作,您最好将数据集转换为记录数组并在索引字段上实现一些自定义搜索例程。

于 2011-08-08T11:47:34.583 回答
0

您应该添加一个要搜索的 ID,以便仅检索预期的行。

在 ReportBuilder数据视图中,转到查询设计器,然后转到搜索选项卡,然后使用“自动搜索”选项添加字段设置。

然后转到 ReportBuilder Calc视图,从菜单中选择“View / Events”。单击“报表对象”树视图中的报表根项,然后双击“OnGetAutoSearchValues”并检索预期值:

var
    Fld : TppAutoSearchField;
    i   : integer;     
begin
  for i:=0 to Report.AutoSearchFieldCount-1 do
  begin
   Fld := Report.AutoSearchFields[i];

    if Fld<>nil then
    begin    
      if (Fld.FieldName='FIRST_PARAM') then 
      begin
        Fld.SearchExpression := .....;
      end
      else if (uppercase(Fld.FieldName)='2ND_PARAM') then
      begin 
        Fld.SearchExpression := intToStr(...);
      end;
    end;
  end;  
end;
于 2011-08-08T12:01:44.243 回答