我有一个在 SQL Server 中运行速度非常慢的查询。请建议优化它以使其运行更快。
TABLE_A
有 100'000'000 行TABLE_B
有 1'000'000 行两个表在
ID
、Modify_Date
和 Source
列上都有非聚集索引。
查询:
Insert into TABLE_A
select * from RABLE_B B
Where NOT Exists (Select 1
From TABLE_A A
Where B.ID = A.ID
And B.Modify_Date = A.Modify_Date
And B.Source = A.Source)
INSERT INTO TABLE_A
SELECT B.*
FROM TABLE_B B
LEFT JOIN TABLE_A A ON B.ID = A.ID
AND B.Modify_Date = A.Modify_Date
AND B.Source = A.Source
WHERE A.ID IS NULL
将表从堆表更改为
ID
上的集群表似乎应该有所帮助。如果 ID
不是唯一的,那么在所有三列上创建复合聚集索引将有助于提高连接速度,因为表中的数据将根据三列在页面上排序。
通过将聚集键设置为复合键,您所采取的权衡是插入和更新将花费更长的时间。但是,如果表结构设计得很好,并且插入和更新语句也设计得很好,那么这是一个值得采取的权衡。
最后,如果此表没有主键,则最好至少添加一个主键,因为您要查找
Table_B
上的所有列以插入到 Table_A
中。添加主键应该有助于优化器不必扫描表,而是使用查找来查找数据。