SQL 添加更多 ID 时查询变慢

SQL Query slows down when more IDs are added

您好,我的 SQL 查询遇到了问题。我需要在最大日期获取每个 ID 的平均位置。虽然下面的查询给出了正确的结果,但 运行 时间似乎随着 IDS 的数量呈指数增长。因此,虽然 1 或 2 个 IDS 几乎是实时的,但 3 个需要几分钟,5 个需要很长时间。因此 运行对 5 个 ID 进行 5 次查询比 运行对单个 ID 进行查询要快得多一个包含所有 5 个。 (我有很多ID需要检查这个,而且数据库很大)。

这是怎么发生的,我该如何避免?

我的猜测是问题来自两次选择相同的 ID 列表,但我不确定如何解决它/如果这确实是问题所在。我查看了有关堆栈溢出的所有类似问题,但没有找到任何可以解决我的问题的问题。

SELECT t.ID, MAX(date) AS MAX(date), AVG(Latitude) AS lat, AVG(Longitude) AS long
FROM table1 t
INNER JOIN (
    SELECT ID, max(date) AS maxdate
    FROM table1 t2
    WHERE ID IN ('1', '2', '3')
    GROUP BY ID
) tm ON t.ID = tm.ID AND t.date = tm.maxdate
WHERE t.ID IN ('1', '2', '3')
GROUP BY t.ID

您可以试试 window 函数:

WITH cte AS (
    SELECT *, RANK() OVER (PARTITION BY id ORDER BY date DESC) AS rn
    FROM t
    WHERE id IN ('1', '2', '3')
)
SELECT id, max(date), min(...)
FROM cte
WHERE rn = 1
GROUP BY id

您可以尝试在 where 子句中使用 exists 运算符,如下所示:

Select ID, MAX(date) as [date], AVG(Latitude) as lat, AVG(Longitude) as long
From table1 As t
Where ID In ('1', '2', '3')
      And Exists (Select * From table1 Where ID=t.ID Group by ID Having Max(date)=t.date)
Group by ID

在我的示例 table 中有 500 万行,它比使用 window 函数要快一点,尤其是对于 suitable 索引。