【问题标题】:Optimize SQL SELECT for 4000 searches, into Excel by VBA优化 SQL SELECT 进行 4000 次搜索,通过 VBA 进入 Excel
【发布时间】:2009-12-14 03:39:23
【问题描述】:

如何通过批处理或其他技术优化速度?我正在从 Excel 2003 VBA 中搜索它的 20MB Access2003 数据库。

我有我的访问表键控(自动编号)所以我虽然这将提供智能非线性搜索,如二进制搜索。目前从 147k 条记录的表中搜索 4000 个值需要 4.2 分钟。

我在搜索中找到了这个:

在 SQL Server 端直接 SELECT 的问题是,除非您正在使用的列上有索引,否则数据库将对表进行线性搜索;那么数据库可以更智能。StackOverflow SQL C# Binary Search Question

这是真的吗?它是否也适用于 Access2003 DB?

VBA 代码,示例:

    Dim cnn As ADODB.Connection
    Dim rst As ADODB.Recordset
    Set cnn = New ADODB.Connection 'open the connection
    With cnn
      .Provider = "Microsoft.Jet.OLEDB.4.0"
      .Open "PNdb2003.mdb"
    End With

    'define the record set
    Set rst = New ADODB.Recordset
    rst.CursorLocation = adUseClient   'for smaller datasets that fit into RAM

    For Each myVariant In Selection.Cells
        strSearchText = myVariant

        Dim sSQL As String
        sSQL = "SELECT Key FROM [MasterTable] WHERE PN=""" & strSearchText & """"

        rst.Open Source:=sSQL, ActiveConnection:=cnn, CursorType:=adOpenStatic, LockType:=adLockOptimistic

        Cells(myVariant.Row, 7).CopyFromRecordset rst

        rst.Close
    Next myVariant

cnn.Close

【问题讨论】:

    标签: sql ms-access vba excel


    【解决方案1】:

    当您声明“Access Table Keyed”时,这与 PN 字段是否相同?如果不是,我怀疑不是,那么在 PN 字段上创建索引将大大提高性能。您还应该对您进行任何搜索的任何其他字段执行此操作。即使为布尔字段建立索引也可以在搜索中产生显着差异,但需要进行前后比较。

    【讨论】:

    • 是的宾果游戏,我只有 field=key 作为索引,但是将 PN 添加为索引会产生巨大的差异。哇,同样的搜索需要 14 秒,而需要 4.2 分钟。
    【解决方案2】:

    是的,除非您的选择包含索引字段,否则最好以线性方式执行主键(或聚集索引)搜索,因为无法进行任何查询优化以确定数据顺序或布局。

    【讨论】:

      【解决方案3】:

      如何在 Excel 工作簿中的表和 Access 数据库中的表之间创建 SQL JOIN,获取结果集一次,最重要的是,按照与工作簿相同的顺序然后使用 CopyFromRecordset once 一次性填充工作簿中的所有行。我想这将比打开记录集四千次要快几个数量级。

      更新

      您能否提供有关您如何操作的 SQL 加入 Excel 电子表格和 访问表

      类似这样的:

      SELECT A1.customer_number
        FROM [MS Access;Database=C:\Tempo\New_Jet_DB.mdb;].Customers AS A1
             LEFT OUTER JOIN
                [Excel 8.0;HDR=YES;IMEX=1;Database=C:\db.xls;].[Sheet1$] AS E1
                ON A1.customer_number = E1.col1;
      

      【讨论】:

      • 我对 Excel 中的 Access 做的工作不多,所以我不知道如何按照您的建议进行操作。您能否提供有关如何从 Excel 连接 ADO 中的 Excel 电子表格和 Access 表的 SQL?
      • +1 以获得出色的答案(我也更愿意立即对 4000 行批量执行集合操作,而不是 4000 个单独操作),并提供 SQL 来执行此操作。
      【解决方案4】:

      根据您的代码示例,最明显的优化提示如下:

      1) 确保您在 MasterTable.PN 上有一个索引。这对于最大化性能和最小化表扫描是绝对必要的。

      2) 尝试组合参数并在单个查询中运行它们,而不是 4000 个单独的查询。也许使用连接您感兴趣的所有值的 IN 语句。这不能 100% 保证更快,但根据我的经验,在这样的循环中运行多个查询往往会产生大量开销。

      重要提示:不要进行这些特定的优化,测试运行每个版本几次,以确认它们在您的特定情况下确实更快。您的里程可能会有所不同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-26
        • 1970-01-01
        相关资源
        最近更新 更多