【问题标题】:How can I debug this sql query to avoid timeout?如何调试此 sql 查询以避免超时?
【发布时间】: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.someSUM(view1.qty) 但查询中没有指定
  • 请检查我的答案,我现在发布了避免超时的部分

标签: sql debugging timeout


【解决方案1】:

我会先在 s2 中取出隐式连接(不应该使用)

【讨论】:

  • 无法关注你,你把它拿出来是什么意思,它不应该在那里?我认为 s1 和 s2 块不是必需的并且过于复杂。我最头疼的是这部分:“s2.some / s1.some * t2.some”。这似乎导致超时...
  • 由于许多原因,旧式连接不如显式连接那么快,这是我在查询中看到的最大问题
【解决方案2】:

语法是过时的遗留代码。 我想我找到了原因。原始(遗留代码)查询语句是 - 或使用? - CTE(公用表表达式)不适用于索引。那是我在某处读到的。我不知道这是否真的是原因,但是,这是我的版本,它有效:

SELECT
  some,
  some,
  some,
  some,
  some,
  some,
  some,
  some / some * some
FROM
  (
    SELECT
      *
    FROM
      (
        SELECT
          a.somelot,
          b.someqty vq
        FROM
          (
            (
              SELECT
                view2.some_id somelot,
                view2.someother_id --added this
              FROM
                someview view2
              WHERE
                view2.some_prefix = 'ABCD'
                AND view2.some_prefix = 'EFGH'
            ) a
            JOIN (
              SELECT
                view1.lot,
                SUM(view1.qty) qty
              FROM
                someview view1
              GROUP BY
                lot,
                qty
            ) b ON a.someother_id = b.lot
          )
      ) s2
      JOIN (
        SELECT
          lot,
          SUM(trans_qty) pq
        FROM
          someview
        WHERE
          side = 'TO'
        GROUP BY
          lot,
          trans_qty
      ) s1 ON s1.lot = s2.lot
      JOIN (
        SELECT
          lot,
          some,
          some,
          trans_qty trans_qty,
          some
        FROM
          someview
        WHERE
          some = 'ZZZZ'
          AND some = 'XXX'
          AND some_prefix = 'WXYZ'
      ) t2 ON t2.lot = s1.lot
      AND t2.lot = s2.lot
  )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-17
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多