我有一个大型SQL Server数据库,其中包含大约45万条记录的表。我将这张表格归档,并且需要删除大于两年前的所有条目。我有插入到我的档案表工作正常,但我有删除时的效率问题。SQL Server 2000删除顶部(1000)
我的问题在于目前在桌上的索引。我想在1000个记录块中删除(和存档插入)。为此,我需要确定满足要求(大于两年)的“最高”1000条记录。行上的DateTime标记是一个聚集索引,所以这对抓取行非常有用。但是SQL 2000不允许删除TOP 1000 ....所以我需要做的是这样的:
DELETE FROM <table> WHERE [UniqueID] IN
(SELECT TOP 1000 [UniqueID] FROM <table> WHERE [DateTime] < @TwoYearsAgo)
这将工作的伟大,如果UniqueID的被索引。由于不是这样,所以需要很长时间(它正在扫描要删除的1000个记录中的每个记录)。表格中没有唯一标识记录的其他索引。我被告知在UniqueID上计算索引的成本太高,因为这是一个实时数据库。任何人都可以指出一种方法来优化此查询?
您是怎么设法添加一个名为UniqueID的列,它标识行,但没有索引?你没有主键吗? – 2009-12-17 23:10:34
我没有设计表格,我是负责存档的项目的新程序员。这是一个繁重的写表(用于记录),但读取并不多,因此创建一个额外的索引(或PK,就此而言)会导致不必要的插入时间增加。这又不是我设计它的方式,而是它的原理。 – Kevin 2009-12-17 23:18:53
那个告诉你索引太贵的人撒谎。 :-) – onupdatecascade 2009-12-17 23:19:46