SQL Server 2000删除顶部(1000)

Kev*_*vin 14 sql sql-server optimization sql-delete

我有一个大型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)
Run Code Online (Sandbox Code Playgroud)

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

ang*_*son 17

如何重写查询?

SET ROWCOUNT 1000
DELETE FROM <table> WHERE [DateTime] < @TwoYearsAgo
Run Code Online (Sandbox Code Playgroud)

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

另请注意,根据DELETE的文档,它支持该TOP子句,但对于SQL Server 2005及更高版本来说这显然是新的.我这样说是因为它听起来像你的数据库服务器不支持,但你真的尝试过使用它吗?我无法访问SQL Server 2000文档,所以我不确定该版本是否支持它.很可能不是.

DELETE TOP (1000) FROM <table> WHERE [DateTime] < @TwoYearsAgo
Run Code Online (Sandbox Code Playgroud)

注意与选择TOP的方式的区别可以写入,没有括号.对于UPDATE,DELETE和INSERT,表达式必须带括号,即使它只是如上所示的常数.


Rem*_*anu 8

您可以删除子查询:

DELETE <table> FROM (
  SELECT TOP 1000 *  
  FROM <table>
  WHERE [DateTime] < @TwoYearsAgo);
Run Code Online (Sandbox Code Playgroud)

请参阅示例E:at SQL 2000 DELETE语法.建议使用SET ROWCOUNT方法.在SQL 2005及更高版本中,您可以直接在DELETE中指定TOP.