【发布时间】:2022-01-17 21:03:47
【问题描述】:
这是我在这里的第一个问题,请温柔。
在工作中,我继承了 MS Access 数据库的责任,这对我的部门来说至关重要。
该数据库已经发展了 20 多年,不断添加、删除和更改内容。很快,这是一个令人费解的混乱。 VBA 代码包含这样的好东西,我不骗你:
Dim p, strText, A, B, C, d, E, F, G, H, i, j, K, L, M, N, O, Z, R, Q, kd, AfGb, T, LN, DC, EntBez, TP, pack, Press, Fehler, ksoll, Y, zeileninhalt, dateipfad, auslesezeile As String
我正在慢慢清理它,但是……无论如何:
问题
打开某些表单时速度很慢(加载时间为 7-10 秒)。我能够将其缩小到这些表单的记录源,它们都使用基本相同的查询或它的变体。
用户在主窗体中输入作业编号并按回车键。然后,底层查询根据唯一键 JobNr 从两个表中提取数据。结果是包含此作业的所有信息的单行。这些信息显示在编辑器表单中,使用查询作为记录源。
数据库分为前端和后端,t1 和 t2 是后端表,每个表大约有 20k 个条目。后端位于公司服务器上的某个位置,前端保存在本地的每台用户计算机上。
这是查询:
SELECT *
FROM t1
INNER JOIN t2 ON t1.JobNr = t2.JobNr
WHERE JobNr = [Forms]![Main]![JobNr];
t1 具有 JobNr 作为主键,t2 具有 ID 作为主键,JobNr 未编入索引。我想尝试对其进行索引以希望获得更好的性能,但目前无法在繁忙的工作日对后端进行更改...
这个简单的查询实在是太慢了。问题似乎是执行顺序。 Access 似乎不是从 t1 和 t2 获取单个条目并将它们加入单个数据集,而是首先将两个 friggin 表作为一个整体加入,然后才查找用户感兴趣的单个数据集。
我无法找到指定执行顺序的解决方案。我尝试了不同的方法,比如用嵌套的 Selects 重写 SQL 代码,比如:
SELECT *
FROM
(SELECT * FROM t1
WHERE t1.JobNr = [Forms]![Main]![JobNr]) AS q1
INNER JOIN
(SELECT * FROM t2
WHERE t2.JobNr = [Forms]![Main]![JobNr]) AS q2 ON q1.JobNr = q2.JobNr;
还是很慢……
我想尝试WITH 对 SQL 代码进行分区,但 MS Access SQL 显然不支持。
我尝试在访问中将查询拆分为两个查询 q1 和 q2,分别从 t1 中提取数据。 t2 与第三个查询 q3 连接这些假定的子集......无济于事。 q1 和 q2 分别运行得非常快,得到了预期的数据结果,但 q3 通常需要 7-10 秒。
我正在使用的当前方法是运行 q1 和 q2 并将获取的数据保存到两个临时表 tq1 和 tq2 中,然后在最后一个查询中加入它们。这非常有效,因为它可以快速加载数据并将其显示在编辑器中(
太好了,我错过了什么/做错了什么?有没有办法在没有整个临时表解决方法的情况下使这个INNER JOIN 查询快速?
如果没有,我将如何从本地临时表更新后端表?编辑器中的更改会保存在临时表中,直到被重新打开编辑器覆盖。
我已经添加了中间查询,添加了相应的查询。临时表的主键(这不能直接在创建表查询中完成......)但是......
我还尝试在关闭编辑器时使用更新查询,这似乎也不起作用,但我可能必须调试那个,我不确定它现在是否会死掉...
抱歉,文字太长了!
提前向您致以诚挚的问候和感谢!
【问题讨论】:
-
顺便说一句,Dim 声明太棒了。 :(
标签: sql vba ms-access ms-access-2016