访问中的编号列导致查询停止响应

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停止响应

GPU 上的计算导致驱动程序错误“停止响应”

来自守护进程的错误响应:无法停止容器 - 信号 init 进程导致“权限被拒绝”

MSP430 停止响应高频查询

Aurora R4显示器驱动以停止响应。GTX 680 双显卡。

unityplayback停止工作