【发布时间】:2012-08-19 11:21:56
【问题描述】:
我在 mysql 中有一个包含大量行数的表(尽管我正在寻找通用 SQL 解决方案)
very_big_table(INT a, INT b, INT c, ...)
我想要 SELECT 语句
SELECT a,
(b + c) as expression1,
(b + c + a) AS expression2 -- basically (expression1 + a)
FROM very_big_table
WHERE ...
GROUP BY a
ORDER BY a DESC
只要表达式 1 简单,这看起来不错且易于阅读。
但是当 CASE-WHEN/IFNULL()/SUM()/MIN()/STRCAT() 或某些运算符在这些表达式中发挥作用时,它很难阅读和调试。
我已经解决了一些已经提出的问题
assigning mysql value to variable inline
Use value of a column for another column (SQL Server)?
How to use conditional columns values in the same select statement?
但如果我使用描述的方法
SELECT a,
expression1,
(expression1 + a) AS expression2
FROM
(SELECT a,
(b + c) AS expression1
FROM very_big_table
WHERE ...
GROUP BY a) as inner_table
ORDER BY a DESC
这可以正常工作,但此查询的执行时间要多 70 倍。至少当我解雇它时,虽然只有一次。
如果我在输出列中有多个级别的 表达式 怎么办?
有什么优雅的方法来处理这个问题,而不影响可读性?
顺便说一句,为什么 SQL 标准或供应商不支持 select 语句中的这个 表达式重用 或 别名引用? (假设在单个 SELECT 语句表达式中没有循环求值。在这种情况下编译器会失败)
【问题讨论】:
-
为什么您认为能够重用表达式别名会导致执行时间减少 70 倍?你能用真实的查询和 .sqlplan 文件来展示一个真实的例子吗?我几乎可以保证,执行时间的这种差异不是由于添加了子查询——其他的东西肯定是不同的。
-
@Quail 仍然无法设想这样一种情况,即这是唯一的区别,它会导致 70 倍的性能差异。
-
在 Aaron 编辑他的评论后,我删除了我的评论。对于后代,它说:“我想他正在比较它,明确指定每一列。”
-
这个非常大的表有没有主键?它是什么?
标签: mysql sql sql-server