Tom*_*son 11 sql t-sql sql-server sql-server-administration
我在SQL Server 2005中有一个表,其中有大约40亿行.我需要删除大约20亿这些行.如果我尝试在单个事务中执行此操作,则事务日志将填满并且失败.我没有任何额外的空间来使事务日志更大.我认为最好的方法是批量删除语句(批量为~10000?).
我可以使用游标执行此操作,但这是一种标准/简单/聪明的方法吗?
PS此表没有标识列作为PK.PK由整数外键和日期组成.
您要删除的行与要保留的行的区别是什么?这对你有用吗:
while exists (select 1 from your_table where <your_condition>)
delete top(10000) from your_table
where <your_condition>
Run Code Online (Sandbox Code Playgroud)
您可以"轻咬"删除,这也意味着您不会对数据库造成大量负载.如果您的t-log备份每10分钟运行一次,那么您应该可以在相同的时间间隔内运行一次或两次.您可以将其安排为SQL代理作业
尝试这样的事情:
DECLARE @count int
SET @count = 10000
DELETE FROM table1
WHERE table1id IN (
SELECT TOP (@count) tableid
FROM table1
WHERE x='y'
)
Run Code Online (Sandbox Code Playgroud)
除了将其与语句一起放入批处理中以截断日志,您可能还想尝试以下技巧:
例如,对于上面的第一点,如果您的 PK 是聚类的,那么找到一个与您要删除每个批次的行数大致匹配的范围,然后使用它:
DECLARE @max_id INT, @start_id INT, @end_id INT, @interval INT
SELECT @start_id = MIN(id), @max_id = MAX(id) FROM My_Table
SET @interval = 100000 -- You need to determine the right number here
SET @end_id = @start_id + @interval
WHILE (@start_id <= @max_id)
BEGIN
DELETE FROM My_Table WHERE id BETWEEN @start_id AND @end_id AND <your criteria>
SET @start_id = @end_id + 1
SET @end_id = @end_id + @interval
END
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
15823 次 |
最近记录: |