在为我的目的找到合适的SQL查询后,我发现我的查询很慢。
WITH temp_table (t_col_1, t_col_2, t_col_3) AS
(
SELECT col_1 AS t_col_1, col_2 AS t_col_2, col_3 AS t_col_3
FROM actual_table
WHERE ID = 100 AND PID = 1245
)
SELECT t_col_1, t_col_2, t_col_3
FROM temp_table AS t1
WHERE t1.t_col_2 BETWEEN 1 AND 12541
AND t1.t_col_1 = (SELECT max(t2.t_col_1)
FROM temp_table AS t2
WHERE t2.t_col_1 < 15147
AND t2.t_col_2 = t1.t_col_2)
ORDER BY t1.t_col_2
我在这种形式下使用查询的原因如下:
有加速查询的优雅方法吗?
提前致谢。
答案 0 :(得分:0)
您的问题是,当您的主查询检查t_col_1
条件时,每个行都会运行有关WHERE
最大值的查询。相反,您可以从运行一次的子查询生成max(t2.t_col_1)
值,然后在您的条件中使用该变量,如下所示:
SELECT PID, t1.t_col_1, t1.t_col_2, t1.t_col_3
FROM
(SELECT PID, t_col_1, t_col_2, t_col_3, max(t2.t_col_1) AS t_col_1_max
FROM temp_table
GROUP BY PID, t_col_1, t_col_2, t_col_3)
as t1
WHERE
(t1.t_col_2 BETWEEN 1 AND 12541)
AND t1.t_col_1 < 15147
AND t1.t_col_1 = t1.t_col_1_max
ORDER BY t1.t_col_2
生成临时表的代码看起来很好。
答案 1 :(得分:0)
答案完全取决于您的查询优化器和数据库统计信息,而这又取决于您选择的数据库。
您可以尝试调整查询,但可能会很幸运,但正确的方法是了解查询计划。
例如,您无法知道&#39; max&#39;很慢或者actual_table可能有十亿行而ID和PID没有索引。