管理大型生产 SQL 数据库的删除
Managing deletion on a large production SQL database
我们有一个大型 SQL 生产数据库 (~1TB),需要定期修剪并保持在合理的大小。 (即每周修剪最旧的一周数据,以便我们始终拥有 X 周的数据)但是,该数据库非常活跃,任何大型 SQL 操作都会降低我们产品的性能。我已经编写了一个存储过程,其中包含一个小的 pyodbc 包装器,用于将删除块分成更小的、可管理的操作。
ALTER PROCEDURE [dbo].[PurgeTickerHistory]
@Start bigint = 0,
@End bigint = 0,
@ChunkSize int = 10000
AS
BEGIN
SET NOCOUNT ON;
declare @r int = 1;
while @r > 0
begin
delete top(@ChunkSize)
from dbo.TickerHistory
where [Timestamp] < @Start and [Timestamp] > @End
set @r = @@ROWCOUNT
end
end
这是解决这个问题的完全可行的方法吗?或者,是否有 'better' 方法以更 efficient/safer 的方式完成我正在做的事情?
是的,这是完全可行的。我们在我现在的商店和前两个商店中做过类似的事情(自 2005 年以来 windows 功能可用)。
我们有一个大型 SQL 生产数据库 (~1TB),需要定期修剪并保持在合理的大小。 (即每周修剪最旧的一周数据,以便我们始终拥有 X 周的数据)但是,该数据库非常活跃,任何大型 SQL 操作都会降低我们产品的性能。我已经编写了一个存储过程,其中包含一个小的 pyodbc 包装器,用于将删除块分成更小的、可管理的操作。
ALTER PROCEDURE [dbo].[PurgeTickerHistory]
@Start bigint = 0,
@End bigint = 0,
@ChunkSize int = 10000
AS
BEGIN
SET NOCOUNT ON;
declare @r int = 1;
while @r > 0
begin
delete top(@ChunkSize)
from dbo.TickerHistory
where [Timestamp] < @Start and [Timestamp] > @End
set @r = @@ROWCOUNT
end
end
这是解决这个问题的完全可行的方法吗?或者,是否有 'better' 方法以更 efficient/safer 的方式完成我正在做的事情?
是的,这是完全可行的。我们在我现在的商店和前两个商店中做过类似的事情(自 2005 年以来 windows 功能可用)。