这条SQL语句向左连接了两个表,每个表的值都约为x。10.000行(table1 = 20列,table2 = 50+列),执行需要60+秒。有没有办法让它更快?
SELECT
t.*, k.*
FROM
table1 AS t
LEFT JOIN
table2 AS k ON t.key_Table1 = k.Key_Table2
WHERE
((t.Time) = (SELECT MAX(t2.Time) FROM table1 AS t2
WHERE t2.key2_Table1 = t.key2_Table1))
ORDER BY
t.Time;
理想的执行时间应小于5秒,因为Excel查询只需8秒即可完成,而且Excel查询的执行速度比SQL Server Express查询快得多,这非常令人惊讶。
执行计划:
发布于 2021-08-24 06:16:36
你也可以更好地重写你的查询:
select *
from table2 as k
join (
select *, row_number() over (partition by Key_Table2 order by time desc) rn
from table1
) t
on t.rn = 1
and t.key_Table1 = k.Key_Table2
但是,如果您还没有Key_Table2、time和key_Table1列,则需要对其进行索引。另外,另一个改进是只选择您想要的列,而不是select *
发布于 2021-08-24 06:58:12
优化器确定合并连接是最好的,但是如果两个表都有10,000行,并且它们没有连接索引列,那么强制优化器退出并告诉它散列连接可能会提高性能
语法是将LEFT JOIN更改为LEFT HASH JOIN
https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008/ms191426(v=sql.100)
https://docs.microsoft.com/en-us/sql/relational-databases/performance/joins?view=sql-server-ver15
https://docs.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql-join?view=sql-server-ver15
发布于 2021-08-24 07:19:36
我建议使用outer apply
重写查询
SELECT t.*, k.*
FROM table1 t OUTER APPLY
(SELECT TOP (1) k.*
FROM table2 k
WHERE t.key_Table1 = k.Key_Table2
ORDER BY Time DESC
) k
ORDER BY t.Time;
对于这个查询,您需要一个table2(Key_Table2, time desc)
上的索引。
https://stackoverflow.com/questions/68908828
复制相似问题