我正在尝试检索一批行,并使用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
另一种技术是将表聚类 - 这意味着您将记录分解为表组。每个表将保留不到一百万行(更像是存档)。然后,当然,查询/添加每个表将是另一回事。