【发布时间】:2021-03-06 21:22:49
【问题描述】:
以下执行速度非常慢,需要很长时间才能执行。即使结果集为空,也需要大约 280 秒。查询中有一些 case 语句。对优化查询的一些帮助将不胜感激。
执行计划: 该计划取决于日期变量输入,日期范围的字段将在 where 子句中更改。 eg: 如果date = '1' 则根据a.created_date 查询日期范围,如果date = '2' 则根据t.active_datetime 查询日期范围
SQL 查询:
SELECT @n:=@n+1 No, a.name customer_name, a.id_number AS customer_id, a.email AS email_address, CONCAT(a.mobile_country_code, '-', a.mobile_number) AS contact_no,
t.status AS status, a.created_date AS registration_date, a.account_type, a.account_id AS account_no, c.wallet_id AS wallet_account_no, t.old_serial_no AS r_id,
t.active_datetime AS activation_date, v.number AS registration_no, v.class AS lass, (CASE WHEN t.is_free = true THEN 'Yes' ELSE 'No' END ) AS replacement,
a.reg_source AS channel, (CASE WHEN a.reg_source = 'ADMIN' THEN t.last_modified_by ELSE 'SYSTEM' END ) AS activated_by, t.replacement_date AS replacement_date,
t.new_serial_no AS new_r_id, d.description AS reason, t.terminated_datetime AS tag_termination_date
FROM abc a
LEFT JOIN def b ON (b.id = a.id)
LEFT JOIN ghi c ON (c.id = b.id), tags t
LEFT JOIN jkl v ON (v.id = t.id)
LEFT JOIN mno d ON (d.code = t.reason_code),
(SELECT @n:= 0) AS n , (SELECT @date := '3') AS date
WHERE
a.account_type IN ( 'PRIVATE') AND a.account_status IN ( 'ACTIVE') AND t.status IN ('ACTIVE') AND
a.reg_source IN ('ADMIN') AND
CASE
WHEN @date = '1' THEN a.created_date BETWEEN '2020-11-24' AND '2020-11-24'
WHEN @date = '2' THEN t.active_datetime BETWEEN '2020-11-24' AND '2020-11-24'
WHEN @date = '3' THEN t.replacement_date BETWEEN '2020-11-24' AND '2020-11-24'
WHEN @date = '4' THEN t.terminated_datetime BETWEEN '2020-11-24' AND '2020-11-24'
END ;
【问题讨论】:
-
您好 - 请提供此查询的执行计划
-
@NickW 感谢您的回复。该计划取决于日期变量输入,日期范围的字段将在 where 子句中更改。 eg:如果date = '1' 则根据a.created_date 查询日期范围,如果date = '2' 则根据t.active_datetime 查询日期范围
-
好的,那么无论日期值如何,还是仅针对特定日期值,查询都很慢?如果您提供最慢日期值的解释计划,那么我们可以从它开始
-
它总是执行缓慢。即使没有满足 where 子句的记录也需要很长时间。所以,我怀疑这可能是由于这些案例陈述。
-
你没有给我们足够的信息来帮助你很好。 Please read this,然后edit您的问题,为我们提供更多信息。
标签: mysql sql datetime mysql-workbench query-optimization