1

我还是 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 分钟或更长时间,并且由于超时问题等原因没有返回结果。

4

2 回答 2

0

子查询为连接表中的每一行运行。解决方法是将子查询嵌套在另一个 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';
于 2013-07-31T03:27:26.393 回答
0
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  

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

于 2013-07-31T02:59:19.987 回答