我有两个表:Sale_Source
(10.000行)和Sale_Target
(10亿行)。我有来自INSERT
的数据对UPDATE
和Sale_Target
Sale_Source
进行四个查询。
id
和Date
上具有非聚集索引id
和Date
上具有索引,但我已禁用它们以提高性能查询
插入查询1:
INSERT INTO dbo.Sale_Target (id, Salevalue, Salestring, Date)
SELECT id, Salevalue, Salestring, Date
FROM dbo.Sale_Source s
WHERE NOT EXISTS (SELECT 1 FROM dbo.Sale_Target t ON s.id = t.id)
更新查询1(日期相同):
UPDATE t
SET t.Salevalue = s.Salevalue,
t.Salestring = s.Salestring
FROM dbo.Sale_Source s
JOIN dbo.Sale_Target t ON t.id = s.id AND s.Date = t.Date
WHERE t.Salevalue <> s.Salevalue OR t.Salestring <> s.Salestring
更新查询#2(当SaleSource上的日期> SaleTarget上的日期时):
UPDATE t
SET t.Salevalue = s.Salevalue,
t.Salestring = s.Salestring
FROM dbo.Sale_Source s
JOIN dbo.Sale_Target t ON t.id = s.id AND s.Date > t.Date
更新查询3(当null
子句中Source的ID为join
时):
UPDATE t
SET t.Salevalue = null,
t.Salestring = null
FROM dbo.Sale_Source s
LEFT JOIN dbo.Sale_Target t ON t.id = s.id
WHERE s.id IS NULL
这四个查询需要1个小时。 30分钟完成,这对于只有10.000行的源表来说非常慢。我认为这里的问题是,每次运行四个查询时,它们都需要再次JOIN
两个源表和目标表,这会花费很多时间。
因此,我有一个主意:
我将创建一个查询,该查询将两个表(源表和目标表)之间的匹配行保存到表 temp_matched 中,并将不匹配的行(与目标不匹配)保存到 temp_nonmatched 。
为此,我现在遇到MERGE
查询问题,因为在MERGE
中我们无法将数据保存到另一个表中。
在INSERT
查询中使用 temp_nonmatched 。我将用 temp_matched 替换表 Sale_Source 。
您有任何想法吗,或者我们可以通过其他方式优化这四个查询吗?
谢谢。
表定义:
UPDATE
答案 0 :(得分:2)
目标表没有索引。
我要做的第一件事是索引id
和date
上的目标表。