【发布时间】:2012-02-29 23:36:16
【问题描述】:
我正在使用 Sybase 的 Advantage 数据库服务器,目前有一个不错的快速左连接查询,运行速度非常快。问题是在运行查询后我想将结果放入一个字符串中。我检索了一个包含 55000 个条目的数据集。 现在最多需要 16 秒。将其放入字符串中。我的查询只用了 8 毫秒即可运行。我的第一次尝试是这样的:
aADSQuery.Open
aADSQuery.First
WHILE not aADSQuery.eof do
begin
s := s + aADSQuery.FieldbyName('Name').asString+',';
aADSQuery.Next;
end;
之后,我尝试这样做以避免 aADSQuery.next,但 aADSQuery.RecordCount 占用了 我 9 秒。
aADSQuery.Open
aADSQuery.First
Count := aADSQuery.RecordCount;
for i:=0 to count-1 do
begin
aADSQuery.RecNo := i;
aADSQuery.FieldbyName('Name').AsString;
end;
数据库被索引,条目 ID 的主键和其他列的索引。 我考虑过创建一个视图来计算我的条目以避免记录计数,这可能与 sql 计数完全相同。但是视图中条目的计数与以前一样。如果我使用 sql 依靠我的基表有 130000 个条目,它只需要 200 毫秒。但是,如果我对结果表进行计数,而不使用视图,我需要 9 秒。我怀疑是这样,因为新的临时结果表没有索引。有谁知道如何以适当的方式处理此类问题或如何获得更快的结果计数?
非常感谢
【问题讨论】:
-
您是否尝试过在 ADS 工具中提取所有记录以比较总提取时间?
-
MySQL 有一个 GROUP_CONCAT 函数可以完全满足您的要求,也许 Advantage DB 包含一个类似的函数...
-
@mjn ADS 的 Avantage 数据架构师在 7 毫秒内为我提供了完整的结果表(55000 行)。这实际上几乎是执行我的 sql 查询的时间。我的问题是,ADS 在展示其结果方面有何不同。会不会是某种缓存问题?
-
@André ADS 真的在 7 毫秒内获取并显示(滚动)所有 55K 行在您的屏幕上吗?我猜这一次只针对显示的第一个结果集记录。
-
@mjn 是的,可能是这样。我猜这些可能是前 300 个条目之类的。好吧,也许我只是想从中得到很多
标签: delphi advantage-database-server