在 Delphi 4 中,我们有一个 SELECT 查询,它使用一个TQuery
组件一次获取 3 个文本类型字段以及其他必填字段。
有超过 1,000 条记录(将来可能会增加)。
此查询消耗大量内存。我认为由于下一个查询需要大量时间来执行。
我正在使用 BDE 连接到 SQL 服务器。
我需要优化性能,这样就不会花费太多时间。请指教。
在 Delphi 4 中,我们有一个 SELECT 查询,它使用一个TQuery
组件一次获取 3 个文本类型字段以及其他必填字段。
有超过 1,000 条记录(将来可能会增加)。
此查询消耗大量内存。我认为由于下一个查询需要大量时间来执行。
我正在使用 BDE 连接到 SQL 服务器。
我需要优化性能,这样就不会花费太多时间。请指教。
您应该考虑某种分页机制。不要向客户端获取 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
字段进行索引(如果可能)以加快速度。
如果您使用 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 下运行。
您可以在我们的网站上下载并寻求支持。
真正获取TEXT
列值需要时间并占用内存。
要加快获取速度,TEXT
请从列表中排除列SELECT
。并且仅在您真正需要它们的值时使用记录主键的附加查询来获取它们。
要减少内存使用量,请执行上述操作,请使用Unidirectional
query 或 bove。
为了减少时间(取决于数据),我们可以在查询中使用 DATALENGTH。
像
DATALENGTH(TEXT) <> 0
这不会加载TEXT
字段中没有值的记录。
仅仅更改数据库组件而不确定这正是原因显然是愚蠢的,如果问题出在其他地方只是浪费时间。BDE 运行良好,尤其是与 ADO 相比。而且微软也在取消对 ADO 的支持,因此我不会在它上面投入时间和金钱。
更新:知道为什么这个答案被否决会很有趣。就因为ADO信徒以后日子不好过,觉得有必要隐瞒真相?
继续反对白痴。你只是表明你的无知!