保持SQL查询的一般性并使其快速

时间:2016-08-26 13:45:23

标签: sql matlab accelerate

在为我的目的找到合适的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

我在这种形式下使用查询的原因如下:

  1. 在Matlab中生成并使用SQL查询来获取数据。
  2. 根据ID,可能会发生列col_1和col_2互换,这就是t_col_1 = col_2和t_col_2 = col_1的原因。在这种情况下,Matlab脚本将替换col_1 AS t_col_2和col_2 AS t_col_1。
  3. 有加速查询的优雅方法吗?

    提前致谢。

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)

答案完全取决于您的查询优化器和数据库统计信息,而这又取决于您选择的数据库。

  1. 获取QEP - 查询执行计划
  2. 查看计划的进展缓慢
  3. 优化查询和/或添加数据库统计信息和/或添加必需的索引
  4. 您可以尝试调整查询,但可能会很幸运,但正确的方法是了解查询计划。

    例如,您无法知道&#39; max&#39;很慢或者actual_table可能有十亿行而ID和PID没有索引。