截断并重新加载 SQL 服务器存储过程中的最新数据 - 仅更新 table 的一部分(允许旧数据保持静态并更新新数据)

Truncate & reload recent data in SQL Server stored procedure - Only update part of table (allow older data to remain static & update new data)

我有一个存储过程,它创建一个包含大量数据的 table。它每天都会截断并重新加载这些数据,这意味着随着时间的推移性能会越来越差。我只想更新和添加过去一年内的数据,但 table.

中仍有旧数据

这是我正在尝试做的事情:

  1. “刷新”过去一年的现有数据
  2. 添加自上次存储过程 运行(每天)以来创建的新记录
  3. 保持 1 年以上的数据不变 - 我想看它但不关心它是否得到更新,因为它根本不可能改变并且它正在减慢速度(我认为)

有人可以帮助我吗?我有点卡住了。我最好的想法是将旧数据存储在 table 中并将其与新数据合并,这似乎没有太大的改进。

下面现在的示例代码:

drop table if exists [TABLENAME];

select 
    blabla1,
    blabla2,
    blabla3
into
    [TABLENAME]
from 
    table1 t1
join 
    table2 t2 on t2.x = t1.x
left join 
    table3 t3 on t3.x = t1.x

刷新时,将行保存在临时 table 中,并从临时 table 中删除超过一年的数据。然后使用合并查询,您可以在其中指定目标和源 (temp table)。这是示例:

MERGE TargetTable AS Target
-- Keys on which you will uniquely match the rows in Target table
USING SourceTable<your temp table> AS Source ON Source.Id = Target.Id 

--Updating the Target rows with Source table rows
WHEN MATCHED THEN 
    UPDATE 
        SET Target.Name = Source.Name,
            Target.Price = Source.Price

-- if rows not matched, insert a new row in table
WHEN NOT MATCHED BY Target THEN 
    INSERT (ProductID, ProductName, Price) 
    VALUES (Source.ProductID, Source.ProductName, Source.Price);

可以参考https://www.sqlshack.com/understanding-the-sql-merge-statement/