【问题标题】:MS Access SQL performance issues INNER JOIN + Update dataMS Access SQL 性能问题 INNER JOIN + 更新数据
【发布时间】:2018-03-14 08:11:54
【问题描述】:

我正在使用 2 个表:

首先作为保存数据的主表

第二个是临时表,每天导入新报表,检查新报表和主表中记录的差异。

        tablename="Temp"
        DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel10, tablename,strPath, True, "A:CH"  
        stringSQL = 
        UPDATE 
        Main INNER JOIN Temp ON Main.[PackageNumber] = Temp.[PackageNumber]
        SET 
        Main.[Field1]=Temp.[Field1],
        Main.[Field2]=Temp.[Field2] ... 

如果在临时表中我可以找到已经存在包号的记录,我必须使用临时表中的数据更新主表中的整行。 主表大约有 30 列,每天大约有几千条记录要检查临时报告。

目前我遇到了性能问题,因为整个操作可能需要一个多小时! 使它运行得更快的可能性是什么? 我已经尝试过“修复和压缩数据库”功能。

【问题讨论】:

    标签: sql database vba performance ms-access


    【解决方案1】:

    您需要在导入表的 JOIN 列上创建一个索引。我假设它是主键。

    运行DoCmd.TransferSpreadsheet 后,执行以下操作:

    CurrentDb.Execute "CREATE UNIQUE INDEX PrimaryKey ON Temp (PackageNumber) WITH PRIMARY"
    

    您的 Main 表应该已经有 PackageNumber 作为主键。

    【讨论】:

      【解决方案2】:

      您可以直接查询 Excel 文件,避免创建临时表以及与之相关的任何开销:

      UPDATE 
          Main INNER JOIN [Excel 10.0;HDR=Yes;DATABASE=C:\YourFile.xls].[A:CH] Temp ON Main.[PackageNumber] = Temp.[PackageNumber]
          SET 
          Main.[Field1]=Temp.[Field1],
          Main.[Field2]=Temp.[Field2] ...
      

      这往往比DoCmd.TransferSpreadsheet 工作得更快,在我看来应该尽可能避免。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-04
        • 1970-01-01
        • 2021-02-04
        • 1970-01-01
        • 2011-03-25
        • 1970-01-01
        • 2017-04-06
        相关资源
        最近更新 更多