SQL Server 2000删除顶部(1000)

我有一个大型sql Server数据库,表中约有4500万条记录.我正在归档这张表,需要在两年前删除所有条目.我有插入我的归档表工作正常,但是我删除时效率问题.

我的问题在于目前在表中的索引.我想删除(和存档插入)在1000个记录块.为此,我需要确定满足要求(大于两岁)的“顶级”1000条记录.行上的DateTime标记是聚簇索引,因此这对于抓取行很有用.但是sql 2000不允许DELETE TOP 1000 ….所以我需要做一些像:

DELETE FROM <table> WHERE [UniqueID] IN 
(SELECT TOP 1000 [UniqueID] FROM <table> WHERE [DateTime] < @TwoYearsAgo)

如果将唯一ID编入索引,这将非常有用.由于不是这样,这需要很长时间(正在扫描要删除的1000条记录中的每一条的表).表上没有唯一标识记录的其他索引.我被告知在UniqueID上计算索引会太贵了,因为这是一个活动数据库.任何人都可以指出一种优化此查询方法

解决方法

如何重写查询
SET ROWCOUNT 1000
DELETE FROM <table> WHERE [DateTime] < @TwoYearsAgo

请参阅SET ROWCOUNT (Transact-SQL)上的文档.

另请注意,根据DELETE的文档,它支持TOP子句,但这显然是sql Server 2005及以上版本的新功能.我在说这个,因为它听起来像是不支持您的数据库服务器,但你实际尝试使用它吗?我无法访问sql Server 2000文档,因此我不确定该版本是否受支持.这很可能不是.

DELETE TOP (1000) FROM <table> WHERE [DateTime] < @TwoYearsAgo

注意与TOP的选择的区别可以写下来,没有括号.对于UPDATE,DELETE和INSERT,表达式必须括起来,即使它只是一个常数,如上所述.

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 &#39;EastRiver&#39; 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...