截断并重新加载 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 年以上的数据不变 - 我想看它但不关心它是否得到更新,因为它根本不可能改变并且它正在减慢速度(我认为)
有人可以帮助我吗?我有点卡住了。我最好的想法是将旧数据存储在 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/
我有一个存储过程,它创建一个包含大量数据的 table。它每天都会截断并重新加载这些数据,这意味着随着时间的推移性能会越来越差。我只想更新和添加过去一年内的数据,但 table.
中仍有旧数据这是我正在尝试做的事情:
- “刷新”过去一年的现有数据
- 添加自上次存储过程 运行(每天)以来创建的新记录
- 保持 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/