MS Access - 速度问题

时间:2017-04-20 19:25:43

标签: ms-access access-vba

我的查询非常缓慢:

SELECT ticketnumber, stateactual, adj, 
  ConcatRelated("utilityname","IntTable","ticketnumber = """ & ticketnumber   & """" & " AND " & "stateactual = """ & stateactual & """") AS utilities, 
  ConcatRelated("startupcustomer","IntTable","ticketnumber = """ & ticketnumber   & """" & " AND " & "stateactual = """ & stateactual & """") as startdates
INTO tixconcat
FROM IntTable
WHERE stateactual = "MT"
GROUP BY ticketnumber, stateactual, adj;

我使用了这个gent的concatrelated查询:

http://allenbrowne.com/func-concat.html

这完美无缺 - 但它真的很慢。就像,一秒钟一个记录。我试图在110万条记录上运行它,我真的需要在下次选举之前完成它。有什么想法吗?

我已经压缩并修复了数据库。

谢谢!

3 个答案:

答案 0 :(得分:1)

评论中的一个人建议索引字段。这工作 - 在一小时内完成整个查询:)

答案 1 :(得分:0)

需要时间的主要事情是ConcatRelated功能。它打开一张桌子,搜索它,给出一个结果,然后每行关闭两次表格。如果要快速完成此过程,则需要使用SQL而不是用户定义的函数来对数据进行非规范化。

要连接你的字段,这是我用来加快字段的过程。

第1步 使用交叉表查询获取要在1行上连接的字段。使用外键作为行标题,并将要连接的内容作为列标题和值

第2步 从交叉表查询

连接要连接的列

第3步进行最终查询,并加入第2步查询的查询/结果

您需要使用5个查询(每个连接字段一次执行步骤1和2),但它仍然比您现在所做的更快。请注意,您已经可以在步骤1中进行过滤。

结果可能略有不同,因为ConcatRelated可以连续两次相同的值,而我的方法不会

答案 2 :(得分:0)

正如其他人所指出的那样,每行调用的功能并不多(这是昂贵的)。但是,加载sql字符串,加载查询处理器,检查SQL语法和THEN JET / ACE必须构建一个查询计划,然后打开表,然后执行查询就是成本所在。

我建议通过查询处理器,并在查询开始时“直接”打开表。这意味着使用seek()命令,因为它将直接命中索引并绕过sql。

此代码的运行速度应快1000倍:

Public Function MyCon(vPK As Variant) As String

  Static rst  As DAO.Recordset
  Static db   As DAO.Database
  Dim strV    As String
  Dim bolF    As Boolean
  'Stop
  If rst Is Nothing Then
     Set db = CurrentDb
     Set rst = db.OpenRecordset("tblChild")
  End If

  With rst
     .Index = "main_id"
     .MoveFirst
     .Seek "=", vPK

     bolF = Not (.NoMatch)
     Do While bolF
        If MyCon <> "" Then MyCon = MyCon & ","
        MyCon = MyCon & rst!InvoiceNumber
       .MoveNext
       If .EOF = True Then
          bolF = False
       Else
          bolF = rst!main_id = vPK
       End If
     Loop
  End With


End Function

上面注意使用“静态” - 这意味着变量KEEPS的值 - 因此我们只打开一次表。