访问中的编号列导致查询停止响应
Posted
技术标签:
【中文标题】访问中的编号列导致查询停止响应【英文标题】:numbering column in access causing query to stop responding 【发布时间】:2013-07-26 12:49:43 【问题描述】:我运行了一些代码来对列中的旧记录进行编号,以便在数据表子表单中对项目进行排序,但是在打开依赖它的主表单时更新了库存交易表中的列之后。它运行一个查询来确定到期的客户余额,并且该查询需要永远运行 2-3 分钟或更长时间,但是恢复到它运行良好的数据的旧副本,我所做的只是重新编号一列中的记录最其中有 1 是重新编号记录的代码:
Dim rst As DAO.Recordset
Dim i As Long
Dim OID As Long
Dim stringSQL as String
i = 1
stringSQL = "SELECT * FROM [Inventory Transactions] " _
& "WHERE [OrderID] > 0 Order By [OrderID],[TransactionID]"
Set rst = CurrentDb.OpenRecordset(stringSQL, dbOpenDynaset)
With rst
OID = rst!OrderID
Do Until .EOF
If OID = rst!OrderID Then
.Edit
!OrderLineNumber = i
.Update
.MoveNext
i = i + 1
Else
OID = rst!OrderID
i = 1
End If
Loop
.Close
End With
Set rst = Nothing
编辑 1:
我今天继续玩这个,打破第二级子查询的查询实际上引用了我更改的库存交易表,但运行良好,但上升到子查询 1 的级别,它引用子查询 2 和支付总和查询,它窒息但是付款总和仅参考付款表。
编辑 2:
我今天做了更多的测试 Subquery2 和支付总和查询的运行速度都比我用秒表计时的速度要快,但是当它们组合起来大约需要 1:45 时,subquery1 中只有 5 列,其中 4 列来自 subquery2,1 列来自总和前 4 个付款中的 3 个是总和,最后一个是分组依据,然后付款总和中的一个是分组依据
子查询 2:
SELECT
CLng((nz([UnitsSold])*nz([UnitPrice]))*(1-nz([Discount]))*100)/100 AS [Line Total],
CLng([Line Total]*(1+nz([SalesTaxRate]))*100)/100 AS [Line Total With Tax],
[Line Total With Tax]-[Line Total] AS [Line Tax],
[Inventory Transactions].*
FROM [Inventory Transactions]
WHERE ((([Inventory Transactions].OrderID) Is Not Null));
支付总额查询:
SELECT DISTINCTROW Payments.OrderID,
Sum(Payments.PaymentAmount) AS [Total Payments]
FROM Payments
GROUP BY Payments.OrderID;
子查询 1:
SELECT
[Balance Due By Customers Subquery2].OrderID,
Sum([Balance Due By Customers Subquery2].[Line Total]) AS [SumOfLine Total],
Sum([Balance Due By Customers Subquery2].[Line Tax]) AS [SumOfLine Tax],
Sum([Balance Due By Customers Subquery2].[Line Total With Tax]) AS [SumOfLine Total With Tax],
[Sum Of Payments Query].[Total Payments]
FROM [Balance Due By Customers Subquery2]
LEFT JOIN [Sum Of Payments Query]
ON [Balance Due By Customers Subquery2].OrderID = [Sum Of Payments Query].OrderID
GROUP BY [Balance Due By Customers Subquery2].OrderID,
[Sum Of Payments Query].[Total Payments];
【问题讨论】:
您的查询在哪里需要永远运行? 它是一个非常复杂的生成表查询,有 4 个子查询,其中只有一个引用了库存交易表,我删除了库存交易。* 并添加了除那个之外的所有其他列 Orderlinenumber 上有索引吗? 不应该有一个吗? ok 测试了没有快乐可能会快一点,但不多 【参考方案1】:-
像
nz()
这样的嵌入式函数会减慢您的查询速度。它们还会使您的 SQL 难以辨认。改进您的表格,因此不需要nz()
。例如,在设计视图中打开您的表格,并为每个数字字段指定一个默认值零。
测试没有DISTINCTROW
关键字的每个查询。查询应该运行得更快。我希望它什么都不做,因为我注意到每个查询在SELECT
子句中都有一个ID
记录。 (看看是否返回了相同数量的记录——是的,它什么也没做。)
您似乎在按OrderID
分组的查询结果也按OrderID
分组。更高级别的GROUP BY
什么都不做。这意味着你的一些 SUM()
函数什么都不做......除了速度很慢。
Subquery 2
是一团糟(抱歉直言不讳)。您需要所有这些字段吗?如果是这样,至少可以通过缩短语法来怜悯我们:[Inventory Transactions].PriceChanged
可以表示为PriceChanged
。并且(至少在未来)避免在表和查询名称中使用空格——您将save yourself trouble。
[Line Total]
之类的计算在初步查询中可能效果更好。在我看来,至少它会是更简洁的编程。
在每个句子的末尾使用句号。这将有助于我们理解您的帖子。
糟糕的设计是脆弱的:它会因为神秘的原因而损坏。良好的设计有助于查询功能,在这种情况下,您需要它来进行故障排除。修复查询通常需要
-
减少和简化,直到问题消失
建立备份到所需的结果。 (更多信息here。)
根据您的Edit 2,您需要在Subquery 2
上使用此方法。 从结合其他两个查询的最简单查询开始。不要使用聚合函数(SUM()
、GROUP BY
)——不知何故,它们把事情搞砸了。
在以改变数据结果的方式进行简化之前,您可以通过仅改进语法来简化这些查询。例如,这里是Subquery 1
,其中包含嵌套查询的别名——更容易阅读:
SELECT
BalanceDue.OrderID,
Sum(BalanceDue.[Line Total]) AS [SumOfLine Total],
Sum(BalanceDue.[Line Tax]) AS [SumOfLine Tax],
Sum(BalanceDue.[Line Total With Tax]) AS [SumOfLine Total With Tax],
SumPmts.[Total Payments]
FROM [Balance Due By Customers Subquery2] AS BalanceDue
LEFT JOIN [Sum Of Payments Query] AS SumPmts
ON BalanceDue.OrderID = SumPmts.OrderID
GROUP BY BalanceDue.OrderID,
SumPmts.[Total Payments];
【讨论】:
添加了一个更简洁的子查询 2 哦,我没有编写查询,但在我更新一列的内容之前它们工作得很好 好吧,确认是聚合函数导致了问题,但我需要没有它们我有 98,996 条记录,而只有 22,625 条记录 运行表分析器(工具菜单)。尝试查询。没有“灵丹妙药”的答案,没有明显的缺陷——现在有人会指出来的。以上是关于访问中的编号列导致查询停止响应的主要内容,如果未能解决你的问题,请参考以下文章
angularjs和jquery冲突导致chrome停止响应
来自守护进程的错误响应:无法停止容器 - 信号 init 进程导致“权限被拒绝”