【发布时间】:2021-11-15 02:27:44
【问题描述】:
我有一个 SQL 查询,尽管让我很头疼,但它实际上并没有做很多事情。老实说,我不知道如何调试这个查询,因为每当我运行它时,它都会运行几分钟,直到我最终强行退出 SQL 开发人员。即使取消查询也需要很长时间。
任何建议,帮助,非常感谢!
SELECT
view2.some_id,
SUM(view1.qty)
FROM
someview view1,
someview view2
WHERE
view1.lot = view2.some_id
AND view2.some_prefix = 'ABCD'
AND view2.some_prefix = 'EFGH'
GROUP BY
view2.some_id
我不知道为什么会导致超时。这个简短的声明 (s2) 是另一个声明的一部分:
CREATE OR REPLACE FORCE EDITIONABLE VIEW "VIEW" AS
WITH s1 AS
(SELECT something
FROM sometable st
WHERE st.side = 'TO'
group by st.lot),
s2 AS
(SELECT
view2.some_id,
SUM(view1.qty)
FROM
someview view1,
someview view2
WHERE
view1.lot = view2.some_id
AND view2.some_prefix = 'ABCD'
AND view2.some_prefix = 'EFGH'
GROUP BY
view2.some_id)
SELECT
t2.some,
t2.some,
t2.some,
s1.some,
t2.some,
t2.some,
s2.some,
s2.some / s1.some * t2.some
FROM
sometable t2, s1, s2
WHERE t2.some = s1.some
AND t2.some = s2.some
AND t2.some = 'FROM' AND t2.some = 'VN1' AND t2.some_prefix = 'ABCD';
请给我任何提示。
更新:我检查了每个表的行数:
sometable st (s1): 2.805.809
view2 (s2): 21.877
view1 (s2): 6.144.386
t2: 121.043
似乎没有那么多......
【问题讨论】:
-
也许键 view1.lot 和 view2.some_id 是多对多的,而隐式连接是导致查询挂起的原因?还有其他可以加入的键吗?
-
首先使用现代(从 30 年前开始)显式
join语法。 -
我使用现代语法重写了它,并逐段重建了查询。我认为这只是数据量,与 sum()..?
-
请添加更新后的查询和有关表格的更多信息。例如,您可以尝试对表进行分区以获得更好的吞吐量。还要指定使用的 DBMS。我认为 SUM() 应该不是问题。你写的查询也不完全清楚:我想
s2.some是SUM(view1.qty)但查询中没有指定 -
请检查我的答案,我现在发布了避免超时的部分