gpt4 book ai didi

sql - 如何在 t-sql 上的 union 子句上获得更好的性能

转载 作者:行者123 更新时间:2023-12-04 23:47:47 25 4
gpt4 key购买 nike

我有三张 table 。每个表包含超过 300 万行。我运行以下代码:

SELECT * FROM 
(
SELECT col_1, col_2, col_3, [date], 1 as type FROM table_1
UNION
SELECT col_1, col_2, col_3, [date], 2 as type FROM table_2
UNION
SELECT col_1, col_2, col_3, [date], 3 as type FROM table_3
) AS tb
tb.[date] BETWEEN (start_date) AND (end_date)
ORDER BY [date] DESC OFFSET n ROWS FETCH NEXT m ROWS ONLY

但是当我得到大的日期间隔时,查询运行得更慢。例如:当我得到 2019-01-01 和 2019-04-01 间隔时,查询运行大约 13-14 秒:

Execution plan

这个结果非常糟糕。我想在 1 秒内得到结果。我能做什么?

最佳答案

从使用 UNION ALL 开始而不是 UNION :

SELECT *
FROM (SELECT col_1, col_2, col_3, [date], 1 as type FROM table_1
UNION ALL
SELECT col_1, col_2, col_3, [date], 2 as type FROM table_2
UNION ALL
SELECT col_1, col_2, col_3, [date], 3 as type FROM table_3
) AS tb
WHERE tb.[date] BETWEEN (start_date) AND (end_date)
ORDER BY [date] DESC
OFFSET n ROWS FETCH NEXT m ROWS ONLY;

SQL 使用 UNION 删除重复项会产生开销. UNION ALL不会产生这种开销。

此外,还有一个关于 date 的索引在每个表中应该有帮助。 SQL Server 有一个很好的优化器,通常会将这些条件下推到 UNION 中的单个查询。/ UNION ALL子查询。

关于sql - 如何在 t-sql 上的 union 子句上获得更好的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55829666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com