【发布时间】:2014-04-22 15:27:12
【问题描述】:
我在 MS Access 2010 中遇到了严重的性能问题(直至超时),查询如下。表 TempTableAnalysis 包含 10'000-15'000 条记录。我已经收到了来自该论坛的意见,以使用前 10 名查询中的临时表 (MS Access 2010 SQL Top N query by group performance issue)
谁能解释一下如何在子查询中实现临时表以及如何加入它?我无法让它工作。
我们非常感谢任何其他提高性能的建议。
这是我的查询:
SELECT
t2.Loc,
t2.ABCByPick,
t2.Planner,
t2.DmdUnit,
ROUND(t2.MASE,2) AS MASE,
ROUND(t2.AFAR,2) AS AFAR
FROM TempTableAnalysis AS t2
WHERE t2.MASE IN (
SELECT TOP 10 t1.MASE
FROM TempTableAnalysis AS t1
WHERE t1.ABCByPick = t2.ABCByPick
ORDER BY t1.MASE DESC
)
ORDER BY
t2.ABCByPick,
t2.MASE DESC;
【问题讨论】:
-
你想做什么?您的性能问题可能来自您在 where 子句中进行选择的事实。每次进行比较时,您也在进行选择。因此,如果您有 1000 行,那么您将在比较的基础上进行一千次选择。您应该尝试重构您的查询,以便使用联接。如果您能解释您的问题,我可以尝试为您提供更多帮助。表名/列很难弄清楚你在做什么。
-
乍一看,我可以告诉你一个 SQL IN-List(即以:
WHERE t2.MASE IN ( SELECT TOP 10 t1.MASE FROM Temp...开头的部分)通常被解释为一个很长的 SQL 字符串ORstatements .即使在 Oracle 数据库上,集合大小超过几千的 IN-List 有时也会出现性能问题。如果您的内部查询(IN-list 集)与最外层集相比足够大,则连接可能更合适或至少值得一试。 -
这里解释一下字段:loc = 仓库,ABCByPick = 产品属性,planner = 产品负责人,dmdunit = 产品零件号,MASE = 产品质量因素(AFAR不相关)。属性 ABCByPick 可以具有从 A 到 F 的值。通过第一个查询,我想通过 ABCByPick 获得前 10 个 MASE。通过第二个查询,我想通过 ABCByPick 和规划器获得前 10 个 MASE(即规划器 1 可能有 ABCByPick = A、B、C 的产品)。我还没有弄清楚如何使用连接来做到这一点,因为所有数据都在一个表中。
-
感谢您的解释。我发布的解决方案解决了原始查询,即
ABCByPick问题。您看起来像是在塑造一套查询结果,这些结果实际上是跨不同维度和分组值的枢轴。看看你是否可以解决其中的性能问题,然后继续讨论如何提供不同的变体。
标签: sql performance ms-access-2010