【发布时间】:2021-08-18 14:39:13
【问题描述】:
我正在尝试在 SQL Server 中使用 LEFT OUTER 连接多个表。在下面的示例中,左边的表并没有那么大,但右边的表大约有 4-5 百万行,而这只是两个表。还有 3 个表需要加入,它们是相当大的表。
-- Example of join for 2 tables
SELECT a.id, a.user_name, a.start_timestamp, a.ref1, a.ref2, a.ref3. a.ref4, b.start_timestamp, b.ref1, b.ref2, b.ref3. b.ref4
FROM
(
SELECT id, user_name, start_timestamp, ref1, ref2, ref3. ref4
FROM user
WHERE DATEDIFF(day,[start_timestamp],GETDATE()) between 0 and 7
) a
LEFT JOIN
(
SELECT id, user_name, start_timestamp, ref1, ref2, ref3. ref4
FROM user_activity
WHERE DATEDIFF(day,[start_timestamp],GETDATE()) between 0 and 7
) b
ON a.id = b.id
我试图将列限制在绝对必要的字段中,并且只占用最近 7 天的时间,但是 SQL 查询非常慢并且需要很长时间。有没有办法优化连接?
【问题讨论】:
-
不要让你的服务器做代数,它不擅长:
WHERE DATEDIFF(day,[start_timestamp],GETDATE()) between 0 and 7应该是WHERE start_timestamp >= DATEADD(day, -7, GETDATE()) AND start_timestamp < GETDATE()。您可能还需要在start_timestamp上使用INCLUDE列的索引。请注意,您所做的子查询对性能没有影响。如需更好的建议,请edit 添加您的表和索引定义,并通过brentozar.com/pastetheplan分享查询计划
标签: sql sql-server left-join query-optimization