提高多个插入和更新查询的性能

时间:2019-05-07 19:39:04

标签: sql sql-server

我有两个表:Sale_Source(10.000行)和Sale_Target(10亿行)。我有来自INSERT的数据对UPDATESale_Target Sale_Source进行四个查询。

  • 源表在idDate上具有非聚集索引
  • 目标表在idDate上具有索引,但我已禁用它们以提高性能

查询

插入查询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两个源表和目标表,这会花费很多时间。

因此,我有一个主意:

  1. 我将创建一个查询,该查询将两个表(源表和目标表)之间的匹配行保存到表 temp_matched 中,并将不匹配的行(与目标不匹配)保存到 temp_nonmatched

    为此,我现在遇到MERGE查询问题,因为在MERGE中我们无法将数据保存到另一个表中。

  2. INSERT查询中使用 temp_nonmatched 。我将用 temp_matched 替换表 Sale_Source

您有任何想法吗,或者我们可以通过其他方式优化这四个查询吗?

谢谢。


表定义:

UPDATE

1 个答案:

答案 0 :(得分:2)

  

目标表没有索引。

我要做的第一件事是索引iddate上的目标表。