【发布时间】:2019-04-24 12:05:53
【问题描述】:
我有三张桌子。每个表包含超过 3M 行。我运行以下代码:
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 秒:
这个结果很糟糕。我想在 1 秒内得到结果。我能做什么?
【问题讨论】:
-
您可以尝试在单个查询中添加 where 条件。
-
对于初学者,由于您的查询结果永远不会重叠(但 SQL Server 不知道这一点),您可以使用
UNION ALL而不是UNION来保存排序步骤。此外,优化器不能总是有效地将外部条件折叠到内部查询中,因此您可能需要在每个查询中重复WHERE date BETWEEN子句。 -
这个查询还非常需要在
date列的所有表中建立索引,否则不可避免地会出现巨大而低效的表扫描。最后但同样重要的是,OFFSET .. FETCH NEXT本质上是一种效率低下的结构,OFFSET越大越慢,因此请确保您没有试图让数据库完成它无法快速完成的事情。跨度> -
我写个人在哪里,但我只给我 1 -2 秒的速度。我也使用联合所有条款。但这对我也没有帮助
-
是的,我在每个表的日期列上创建索引。完成后,执行时间缩短到 13-14 秒。
标签: sql sql-server tsql query-performance