-1

I am scanning an SQLite database looking for all matches and using

OneFound:=False;
if tbl1.FieldByName('Name').AsString = 'jones' then
begin
  OneFound:=True;
  tbl1.Next;
end;
if OneFound then // Do something

or should I be using

if not(OneFound) then OneFound:=True;

Is it faster to just assign "True" to OneFound no matter how many times it is assigned or should I do the comparison and only change OneFuond the first time?

I know a better way would be to use FTS3, but for now I have to scan the database and the question is more on the approach to setting OneFound as many times as a match is encountered or using the compare-approach and setting it just once.

Thanks

4

3 回答 3

4

你的问题是,哪个更快:

if not(OneFound) then OneFound:=True;

或者

OneFound := True;

答案可能是第二个更快。条件语句涉及分支,这可能会导致分支预测错误。

然而,与它周围的代码相比,那行代码是微不足道的。一次在数据库中运行一行将非常昂贵。我敢打赌,您将无法衡量这两个选项之间的差异,因为对那一点点的处理Boolean只是被其余代码所淹没。在这种情况下,选择更易读和更简单的版本。

但是,如果您关心此代码的性能,您应该要求数据库完成这项工作,正如您自己所说的那样。编写一个查询来执行这项工作。

于 2013-04-27T17:24:17.253 回答
3

最好更改您的 SQL 语句,以便在数据库中完成工作。如果您想知道在“name”字段中是否存在包含值“jones”的元组,那么更快的查询将是

with tquery.create (nil) do
 begin
  sql.add ('select name from tbl1 where name = :p1 limit 1');
  sql.params[0].asstring:= 'jones';
  open;
  onefound:= not isempty;
  close;
  free
 end;

关于 'limit' 子句,您的语法可能会有所不同,但想法是从数据库中只返回一个与 'where' 语句匹配的元组 - 哪个都没有关系。

我使用了一个参数来避免界定值的问题。

于 2013-04-28T05:41:58.227 回答
0

1. 搜索一个字段

如果要搜索一个特定的字段内容,使用 INDEX 和 SELECT 将是最快的。

   SELECT * FROM MYTABLE WHERE NAME='Jones';

不要忘记首先在列上创建一个索引!

2. 快速阅读

但是,如果您想一个字段或多个字段内进行搜索,您可能必须阅读并检查整个内容。在这种情况下,对每个数据行调用会很慢FieldByName():您最好使用局部TField变量。

或者忘记TDataSet,并切换到直接访问 SQLite3。事实上,使用DB.pasandTDataSet需要大量的数据编组,因此比直接访问要慢。

参见例如DiSQLite3或我们的DB 类,它们非常快,但更高级别。或者,您可以在这些类之上使用我们的 ORM。我们的类每秒能够从 SQLite3 数据库中读取超过 500,000 行,包括将 JSON 编组到对象字段中。

3. FTS3/FTS4

但是,正如您所猜测的,最快的确实是使用SQlite3 的 FTS3/FTS4 功能

您可以将 FTS4/FTS4 视为提供的文本块上的“元索引”或“全文索引”。就像 google 能够在数百万个网页中找到一个词:它不使用常规数据库,而是使用全文索引

简而言之,您在数据库中创建一个虚拟 FTS3/FTS4 表,然后在该表中插入 FTS TEXT 字段中主要记录的整个文本,强制 ID 字段成为原始数据行之一。

然后,您将在 FTS3/FTS4 表上查询一些单词,这将为您提供匹配的 ID,比常规扫描快得多。

请注意,我们的 ORM 具有用于直接 FTS 流程的专用TSQLRecordFTS3/TSQLRecordFTS4类类。

于 2013-04-28T08:01:17.210 回答