3

在 Delphi 4 中,我们有一个 SELECT 查询,它使用一个TQuery组件一次获取 3 个文本类型字段以及其他必填字段。
有超过 1,000 条记录(将来可能会增加)。
此查询消耗大量内存。我认为由于下一个查询需要大量时间来执行。

我正在使用 BDE 连接到 SQL 服务器。

我需要优化性能,这样就不会花费太多时间。请指教。

4

5 回答 5

2

您应该考虑某种分页机制。不要向客户端获取 1000 条(或 100 万条)记录,而是使用SQL 服务器ROW_NUMBER()进行分页来获取每页 50-100 条记录的块。

所以像这样的查询:

SELECT id, username FROM mytable ORDER BY id

可能看起来像这样:

SELECT * FROM (
SELECT id, username, TOTAL_ROWS=Count(*) OVER(), ROW_NUMBER() OVER(ORDER BY id) AS ROW_NUM
FROM mytable 
) T1
WHERE ROW_NUM BETWEEN 1 AND 50

应该对ORDER BY字段进行索引(如果可能)以加快速度。

于 2011-12-15T10:42:16.017 回答
1

如果您使用 a TQuery,请确保TField在检索循环之外使用 local 以加快处理速度(该FieldByName方法有点慢)。

您可以尝试我们的免费软件开源类来访问任何数据库引擎。

它通过 OleDB 提供对 MS SQL 的直接访问,无需调用 ADO 层。

它针对速度进行了非常优化,并且支持 Unicode,即使在旧版本的 Delphi 上也是如此。它已经在 Windows XP、Vista 和 7(包括 64 位)上进行了测试。

它有一个TQuery模拟器:这不是在DB.pasTQuery单元中定义的true ,而是一个具有大多数相同方法的类。而且您不需要使用所有 BDE 类和单元。缺点是您不能使用 Delphi DB 可视化控件,但对于快速 TQuery,它会完成工作。

它有一些独特的功能(例如用于字段访问的后期绑定),值得考虑。

它不需要任何第三方库(如 BDE),并且适用于从 Delphi 5 到 XE2。我猜它也会在 Delphi 4 下运行。

您可以在我们的网站上下载并寻求支持。

于 2011-12-15T08:34:07.623 回答
0

真正获取TEXT列值需要时间并占用内存。

要加快获取速度,TEXT请从列表中排除列SELECT。并且仅在您真正需要它们的值时使用记录主键的附加查询来获取它们。

要减少内存使用量,请执行上述操作,请使用Unidirectionalquery 或 bove。

于 2011-12-15T17:46:34.043 回答
0

为了减少时间(取决于数据),我们可以在查询中使用 DATALENGTH。

DATALENGTH(TEXT) <> 0

这不会加载TEXT字段中没有值的记录。

于 2012-05-16T12:19:34.810 回答
-2
  • 您定义了哪些字段类型?如果它们很大,它们会占用内存,对此您无能为力。你可以尝试不同的库,有些足够聪明,只分配字段的实际大小而不是声明的,其他的总是分配声明的,所以如果你有 4000 个字符和 1000 条记录的三个字段,你将有 3 *仅为文本字段分配 4000 * 1000 字节。
  • 您需要一次加载整个数据集吗?使用 where 条件和/或增量获取仅获取所需的数据将有助于减少内存和执行时间
  • 如果查询需要很长时间才能执行,您必须了解原因和位置。它可能是查询执行时间本身,也可能是将结果集传输到客户端应用程序所花费的时间。您需要分析您的查询以了解实际问题是什么,并采取适当的纠正措施。1000 条记录在今天是一个非常小的数据集,如果它很慢,那就是真的很糟糕。
  • 每个数据库都有细微的优化差异。您必须仔细研究您正在使用的数据库,并为该数据库编写正确的查询 - 在您设计了正确的数据库之后。

仅仅更改数据库组件而不确定这正是原因显然是愚蠢的,如果问题出在其他地方只是浪费时间。BDE 运行良好,尤其是与 ADO 相比。而且微软也在取消对 ADO 的支持,因此我不会在它上面投入时间和金钱。

更新:知道为什么这个答案被否决会很有趣。就因为ADO信徒以后日子不好过,觉得有必要隐瞒真相?

继续反对白痴。你只是表明你的无知!

于 2011-12-15T08:59:41.917 回答