【问题标题】:SQL query too long, is there a way to clean the codes?SQL查询太长,有没有办法清理代码?
【发布时间】:2013-07-31 02:18:50
【问题描述】:

我还是 sql 新手,我的代码运行时间太长。

这是我的代码

SELECT SUM(b.matchusertime)
FROM(
SELECT fulldate, realmatchid, isclanmatch
FROM go_int.int_match
WHERE (fulldate BETWEEN '2013-06-30' AND '2013-07-27') AND isclanmatch = 0
GROUP BY realmatchid)a
INNER JOIN go_int.int_match_user b
ON b.realmatchid = a.realmatchid
WHERE (b.fulldate BETWEEN '2013-06-30' AND '2013-07-27')

我正在尝试做的是从匹配表中获取不在氏族匹配中的用户 ID,并将其匹配到 match_user 表中,以找出非氏族匹配的总持续时间。

但每次我运行查询时,都需要 45 分钟或更长时间,并且由于超时问题等原因没有返回结果。

【问题讨论】:

  • 桌子有多大?你用的是什么数据库?你有什么索引?
  • 表格很大,超过 500,000 行。 match 可能有很多列,大约 8 列。对于 match 用户,它有大约 15 列。
  • 在不知道您当前的索引是什么、您正在使用的数据库以及您的查询的查询计划的情况下,任何有关性能的提示都只是猜测。

标签: sql join long-integer


【解决方案1】:
SELECT SUM(b.matchusertime)
FROM(
SELECT fulldate, realmatchid, isclanmatch
FROM go_int.int_match INNER JOIN go_int.int_match_user b 
ON b.realmatchid = a.realmatchid 
WHERE (fulldate BETWEEN '2013-06-30' AND '2013-07-27') AND isclanmatch = 0
GROUP BY realmatchid)a  

我修改了您的相同查询。请尝试使用此查询。如果您可以粘贴带有虚拟数据的示例表结构,它可能会帮助我们提供支持。谢谢。

【讨论】:

  • 嗨,它返回了一个错误 (1052)。说明 fulldate 不明确
  • 在 where 条件中提到 fulldate 和 isclanmatch 来自哪个表。例如: - yourTable.fulldate 和 yourTable.isclanmatch
  • 是的,我做到了。但它给出了一个错误。 SELECT SUM(b.matchusertime) FROM( SELECT fulldate, realmatchid, isclanmatch FROM go_int.int_match a INNER JOIN go_int.int_match_user b ON b.realmatchid = a.realmatchid WHERE (b.fulldate BETWEEN '2013-06-30' AND '2013-07-27') AND b.isclanmatch = 0 GROUP BY realmatchid)a
  • 错误是什么?也修复这个问题:- 按 yourTable.realmatchid 分组
  • Error Code: 1052 Column 'fulldate' in field list is ambiguous 是的,我也这样做了。
【解决方案2】:

子查询针对连接表中的每一行运行。解决方法是将子查询嵌套在另一个 select 语句中。这将导致从子查询创建派生表(存储在内存中的临时表),并且无需为每一行运行它。

SELECT SUM(b.matchusertime)
FROM (
  SELECT * FROM (
    SELECT fulldate, realmatchid, isclanmatch 
    FROM go_int.int_match
    WHERE (fulldate BETWEEN '2013-06-30' AND '2013-07-27') AND isclanmatch = 0
    GROUP BY realmatchid
  ) dt
) a
INNER JOIN go_int.int_match_user b ON b.realmatchid = a.realmatchid
WHERE b.fulldate BETWEEN '2013-06-30' AND '2013-07-27';

【讨论】:

  • 实际上,从头开始。这只是依赖子查询的情况。
  • 它会按原样工作。在仔细查看查询后,我认为这不是问题所在。您可以为每个表发布几个示例行以及预期结果的示例吗?也许有了更好的理解,我们可以提出更有效的查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多