【问题标题】:Keep SQL query general and make it fast保持 SQL 查询通用并使其快速
【发布时间】:2016-08-26 13:45:23
【问题描述】:

在为我的目的找到正确的 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。

有没有一种优雅的方式来加速查询?

提前致谢。

【问题讨论】:

    标签: sql matlab accelerate


    【解决方案1】:

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

    1. 获取 QEP - 查询执行计划
    2. 查看计划缓慢的地方
    3. 优化查询和/或添加数据库统计信息和/或添加所需索引

    您可以尝试调整查询并可能会很幸运,但正确的方法是了解查询计划。

    例如,您无法知道“max”是否很慢,或者 actual_table 可能有十亿行没有 ID 和 PID 索引。

    【讨论】:

      【解决方案2】:

      您的问题是关于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
      

      您生成临时表的代码看起来不错。

      【讨论】:

      • 很遗憾,上面的 SQL 查询不起作用。会不会是内部 SELECT 语句有错误?谢谢。
      • 也许多评论一条;当 t_col_1 和 t_col_2 是日期时,您的 SQL 查询是否也有效?我的查询中的数字只是一个例子。
      • @grima 啊,我忘记了GROUP BY 声明。内部查询现在应该可以工作了。至于如果数据是日期,它是否适用于您的数据,如果您给我一个表格样本,我可以更好地回答。
      • 非常感谢您的帮助。我现在使用一种更简单的方法...准确地说,我已经硬编码了两个 SQL 查询。
      猜你喜欢
      • 2018-05-05
      • 2022-11-29
      • 2013-08-31
      • 1970-01-01
      • 2011-01-09
      • 2015-04-07
      • 1970-01-01
      • 2018-06-05
      • 2022-01-19
      相关资源
      最近更新 更多