【问题标题】:Delphi ADO with MS Access - query times reduce after running specific query带有 MS Access 的 Delphi ADO - 运行特定查询后查询时间减少
【发布时间】:2012-02-14 17:47:38
【问题描述】:

我有一个带有 3 个表单的 Delphi 应用程序,我正在使用 Access 2003 和 Microsoft.Jet.OLEDB.4.0,我在主表单中有一个 ADOconnection 并在所有表单中使用它。

我使用 2 个 .mdb 文件,其中 my.mdb 具有指向 org.mdb 表的链接。

一切正常,但非常缓慢。因此,经过长时间的搜索,我来到了这里。

我不知道为什么,但是在我运行这个查询之后,所有其他查询的速度都显着提高(从 1 秒以下的 10 秒开始)。 (即使是不排除链接表的查询)。

表 tb_odsotnost 位于 my.mdb
表 Userinfo 已链接。

  with rQueries.ADOQuery1 do
    begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT DISTINCT tb_odsotnost.UserID, Userinfo.Name FROM tb_odsotnost');
    SQL.Add('LEFT JOIN Userinfo ON Userinfo.UserID = tb_odsotnost.UserID');
    SQL.Add('WHERE datum BETWEEN '+startDate+' AND'+endDate);
    SQL.Add('ORDER BY Userinfo.Name ASC');
    Open;
  end;

我尝试在另一台装有 win7 和 MS Access 2007 的计算机上运行我的应用程序,结果是一样的。

好的,现在我只是在 onFormActivate 上运行这个查询,但这不是一个永久的解决方案。

【问题讨论】:

  • SQL 的这种小小的平静如何影响所有其他查询?我不想每次启动程序时都运行此查询。没有它,其他查询应该很快。所以我想知道访问是否有一些“功能/兑现......”我不知道。它会产生隐藏的关系吗?我将该过程移动到一个新表单(创建了一个新连接)并尝试运行不同的查询,结果是相同的。在我运行上面的查询之前,一切都运行得很慢。我不知道我还能检查什么。

标签: delphi delphi-7 ado ms-access-2003


【解决方案1】:

当您对链接表运行查询时,Access(或 Jet 或 ADO)会为 ldb 文件获取数据库锁。如果关闭查询,则必须在下次查询链接表时重新获取该锁。解决此问题的推荐方法是始终保持后台数据集打开,这样就不必每次都获得锁(强制锁保持有效)。

请参阅http://office.microsoft.com/en-us/access-help/improve-performance-of-an-access-database-HP005187453.aspx 并查看“提高链接表的性能”部分。

如果这没有帮助,请查看 Access 中的表定义,看看您是否在一对多关系中为表字段定义了子数据表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多