首页 > 解决方案 > CASE..ELSE 将为未使用的表达式占用额外的内存

问题描述

我正在使用MySQL 5.7,现在我正在运行 SQL:

 SELECT COUNT(1) AS `m0`
FROM (
  SELECT (CASE WHEN ...
          ELSE CAST(app_name AS CHAR(255)) END) AS d0,
  ...
  FROM tableA
  GROUP BY (CASE WHEN ...  ELSE CAST(app_name AS CHAR(255)) END), 
  BINARY (CASE WHEN ... ELSE CAST(app_name AS CHAR(255)) END),
  ...
) AS `T_COUNT_` 

现在结果说

Error Code: 1038, Out of sort memory, consider increasing server sort buffer size

但是,当我将 3 个CAST(app_name AS CHAR(255))语句更改为时CAST(app_name AS CHAR(25)),它按预期工作!

我知道该类型CHAR(255)将安排 255 字节的内存,这将花费很大,但ALL可能的值已在CASE WHEN语句中列出(已多次检查和确认)。这意味着根本不应该使用ELSEin ,那么为什么我减少there可以使SQL正常运行呢?CASE WHENCHAR()

任何帮助表示赞赏。

标签: mysqlsql

解决方案


推荐阅读