Select 行批次 SQL Server 2008
Select batch of rows 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
这在第一批中首先表现良好,但随着它达到更高的行数而变得越来越慢,并且我正在使用的 table 中有一个超过 270 万行。
有什么方法可以做到线性性能吗?
主键列上有一个聚集索引,其他一些列上有 5 个非唯一、非聚集索引。我按顺序分批处理整个 table,目前选择 10,000 作为批量大小。 1-10,000 的查询用时不到一秒,但例如,200,000 - 210,000 的查询需要 10 秒,而当它达到数百万时,它会超过 1 分钟。
要么记住上一批的最大 ID 并执行
SELECT top 10000 ...
WHERE id > @maxid
ORDER BY id
或者您可以使用 Api Cursor 高效地处理顺序块中的 table。
索引在以下情况下变得无用:
1.) 太多了
2.) 当table归一化不佳时。
作为经验法则:
1.) 保持索引的数量,每个 table.
3-5 或更少
2.) 如有必要,将您的 table 标准化为第三种形式。良好规范化的 table 解决了要应用的正确索引数。列和 NULL/duplicate 值越小,性能越好。关于规范化的众多参考之一:http://agiledata.org/essays/dataNormalization.html
另一种技术是将您的 table 聚类 - 这意味着您将记录分成 table 组。每个 table 将保留少于一百万行(更像是归档)。然后,当然,querying/adding 每个 table 将是另一个故事。
我正在尝试检索一批行并使用 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
这在第一批中首先表现良好,但随着它达到更高的行数而变得越来越慢,并且我正在使用的 table 中有一个超过 270 万行。
有什么方法可以做到线性性能吗?
主键列上有一个聚集索引,其他一些列上有 5 个非唯一、非聚集索引。我按顺序分批处理整个 table,目前选择 10,000 作为批量大小。 1-10,000 的查询用时不到一秒,但例如,200,000 - 210,000 的查询需要 10 秒,而当它达到数百万时,它会超过 1 分钟。
要么记住上一批的最大 ID 并执行
SELECT top 10000 ...
WHERE id > @maxid
ORDER BY id
或者您可以使用 Api Cursor 高效地处理顺序块中的 table。
索引在以下情况下变得无用:
1.) 太多了
2.) 当table归一化不佳时。
作为经验法则:
1.) 保持索引的数量,每个 table.
3-5 或更少2.) 如有必要,将您的 table 标准化为第三种形式。良好规范化的 table 解决了要应用的正确索引数。列和 NULL/duplicate 值越小,性能越好。关于规范化的众多参考之一:http://agiledata.org/essays/dataNormalization.html
另一种技术是将您的 table 聚类 - 这意味着您将记录分成 table 组。每个 table 将保留少于一百万行(更像是归档)。然后,当然,querying/adding 每个 table 将是另一个故事。