我的查询非常缓慢:
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万条记录上运行它,我真的需要在下次选举之前完成它。有什么想法吗?
我已经压缩并修复了数据库。
谢谢!
答案 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的值 - 因此我们只打开一次表。