选择一批行 SQL Server 2008



我正在尝试检索一批行,并使用row_number函数实现了此操作,例如检索前 10,000 行,如下所示:

select * 
from 
    (select 
         row_number() over (order by id) as row_num, * 
     from 
         forms) as batch
where 
    batch.row_num between 1 and 10000

这首先在第一批中表现良好,但随着它达到更高的行号,并且我使用的一个表> 270 万行,它变得越来越慢。

有没有办法用线性性能做到这一点?


主键列上有一个聚集索引

,其他一些列上还有其他 5 个非唯一、非聚集索引。我正在按顺序批量处理整个表,目前已选择 10,000 作为批量大小。1-10,000 查询需要不到一秒的时间,但例如,200,000 - 210,000 需要 10 秒,当它达到数百万时,它> 1 分钟。

要么记住上一批的最大 id,然后执行

SELECT top 10000 ... 
WHERE id > @maxid 
ORDER BY id

或者,您可以使用 API 游标以顺序块的形式高效处理表。

索引在以下情况下变得无用:

1.)太多这样的

2.) 当表标准化不佳时。

根据经验法则:

1.) 保持索引的 # 不多,每张表 3-5 个或更少。

2.) 如有必要,将您的表格规范化为 3 种形式。规范化良好的表可以解决要应用的正确 # 索引。列和 NULL/重复值越少,性能越好。关于规范化的众多参考之一:http://agiledata.org/essays/dataNormalization.html

另一种技术是将表聚类 - 这意味着您将记录分解为表组。每个表将保留不到一百万行(更像是存档)。然后,当然,查询/添加每个表将是另一回事。

最新更新