MS访问 - 速度问题



我的查询很慢:

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;

我使用了这个绅士的联合查询:

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

这效果很好 - 但确实很慢。就像,一个记录一秒钟。我正在尝试在110万张唱片上运行此操作,并且我真的需要在下次选举之前的某个时候进行。有什么想法吗?

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

谢谢!

花费时间的主要因素是连接的函数。它正在打开一张桌子,搜索它,给出结果,然后每行两次关闭桌子。如果您想快速进行此过程,则需要使用SQL而不是用户定义的功能来使您的数据构成简化。

要加入您的字段,这是我用来使其快速的过程。

步骤1 使用Crosstab查询来获取要在1行上加入的字段。将外国钥匙用作行标题,以及您要连接的东西作为列标题和Value

步骤2 加入您要从crosstab查询串联的列

步骤3 进行最终查询,然后从步骤2

加入查询/结果

您需要使用5个查询(每个串联字段一次和2步一次(,但它仍然比现在要做的要快。请注意,您可以在步骤1中过滤。

结果可能会略有不同,因为串联可以将相同的值进行两次,而我的方法不会

在评论中有一个人暗示索引字段。有效 - 在一个小时内运行整个查询:(

正如其他人所指出的那样,它并不是要为每一行的函数呼叫太多(这是昂贵的(。但是,加载SQL字符串,加载查询处理器,检查SQL语法,然后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

注意"静态"的使用中 - 这意味着变量保持其值 - 因此,我们仅一次打开表。

最新更新