选择SQL Server 2008中的批处理行

选择SQL Server 2008中的批处理行,sql,sql-server,sql-server-2008,sqlperformance,Sql,Sql Server,Sql Server 2008,Sqlperformance,我尝试检索一批行,并使用row_number函数实现了这一点,例如检索前10000行,如下所示: select * from (select row_number() over (order by id) as row_num, * from forms) as batch where batch.row_num between 1 and 10000 这在第一批中执行得很好,但当它达到较高的行数时会逐渐变慢,并且我正在

我尝试检索一批行,并使用row_number函数实现了这一点,例如检索前10000行,如下所示:

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个非唯一、非聚集索引。我正在按顺序处理整个表,目前选择10000作为批量大小。1-10000查询只需要不到一秒钟的时间,但是,例如,200000-210000查询只需要10秒钟,而当它以百万计时,它就超过了1分钟

记住上一批中的最大id并执行以下操作

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

或者,您可以使用有效地按顺序块处理表。

或者记住上一批中的最大id并执行

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

或者,您可以使用来高效地按顺序块处理表。

索引在以下情况下无效:

一,。这些东西太多了

二,。当表的规格化不好时

根据经验:

一,。保持索引的间隔,每个表3-5个或更少

二,。如有必要,将表格规格化为第三种形式。一个规范化良好的表处理了要应用的索引的适当数量。列和空/重复值越小,性能越好。关于规范化的众多参考文献之一:


另一种技术是对表进行集群,这意味着将记录拆分为多组表。每个表将保留不到一百万行的数据,就像归档一样。当然,查询/添加每个表将是另一回事。

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

一,。这些东西太多了

二,。当表的规格化不好时

根据经验:

一,。保持索引的间隔,每个表3-5个或更少

二,。如有必要,将表格规格化为第三种形式。一个规范化良好的表处理了要应用的索引的适当数量。列和空/重复值越小,性能越好。关于规范化的众多参考文献之一:


另一种技术是对表进行集群,这意味着将记录拆分为多组表。每个表将保留不到一百万行的数据,就像归档一样。当然,查询/添加每个表将是另一回事。

表上有哪些索引?用例是什么?按顺序分批处理整个表或寻找任意批次?主键列上有一个聚集索引,其他一些列上有5个非唯一、非聚集索引。我正在按顺序处理整个表,目前选择10000作为批量大小。1-10000查询只需不到一秒钟,但是,例如,200000-210000查询只需10秒钟,当它以百万计时,它已超过1分钟。表中有哪些索引?用例是什么?按顺序分批处理整个表或寻找任意批次?主键列上有一个聚集索引,其他一些列上有5个非唯一、非聚集索引。我正在按顺序处理整个表,目前选择10000作为批量大小。1-10000查询只需要不到一秒钟的时间,但是,例如,200000-210000查询只需要10秒钟,而当它以百万计时,它就超过了1分钟。