试图弄清楚为什么此SQL请求需要47分钟才能执行

时间:2019-04-09 17:53:28

标签: sql excel vba qsqlquery

我正在尝试发出SQL请求,但该请求要花很长时间才能完成。该请求是在带有VBA的Excel 2003中完成的。

表的大小:

  • TABLE1 = 12600行
  • TABLE2 = 361K行

以下是查询:

SELECT DISTINCT 
    y.code AS CODE,
    y.name AS LIBELLE,
    #[...]
    #[...]
    #[...]
    #[...]
    y.IS_BILAN,
    y.INACTIVE,
    (SELECT COUNT(1) 
     FROM TABLE1 d, TABLE2 a 
     WHERE a.record_date_time >= '2018/01/01' 
       AND a.record_date_time < '2019/01/01' 
       AND global_status <> 'C' 
       AND a.id = d.id 
       AND d.type_id = y.code) AS TOTAL_2018
FROM 
    anal_exam y 
ORDER BY 
    code

删除最后一部分“ SELECT COUNT(1)”时,整个查询会立即运行

我在Oracle SQL Developer中看到的执行计划:

Execution plan

如何加快此查询的速度?完成需要47分钟

3 个答案:

答案 0 :(得分:1)

尝试像这样定义您的JOIN

SELECT DISTINCT 
 y.code AS CODE,
 y.name AS LIBELLE,
 y.IS_BILAN,
 y.INACTIVE,
 COUNT(*) AS TOTAL_2018
FROM anal_exam y 
JOIN TABLE1 d
  ON d.type_id = y.code
  JOIN TABLE2 a 
    ON d.ID = a.ID
WHERE a.record_date_time BETWEEN '2018/01/01' AND '2019/01/01'
  AND global_status <> 'C'
order by code

答案 1 :(得分:0)

我在末尾添加了GROUP BY y.code, y.name, y.IS_BILAN, y.inactive,它可以正常工作

  • 运行时间为47秒。

这是非常快的,但我想知道是否有一种方法来获取count = 0的行,因为此查询中省略了3k行

答案 2 :(得分:0)

使用T McKeown的代码,我得到以下结果:

CODE1|LIBELLE1|T|T|1530
CODE3|LIBELLE2|T|T|20
CODE5|LIBELLE3|T|T|143

我要搜索的结果包括带有count()= 0的行

CODE1|LIBELLE1|T|T|1530
CODE2|LIBELLE2|T|F|0
CODE3|LIBELLE2|T|F|20
CODE4|LIBELLE4|T|T|0
CODE5|LIBELLE3|F|T|143

我该如何实现?