2010-03-15 59 views
15

用于大于1,000,000行并且可能还有更多数目的表!在sql 2008中使用大型表进行高效分页

还没有做任何基准自己所以想得到专家的意见。

看了看ROW_NUMBER()的一些文章,但它似乎会影响性能

什么其他的选择/替代方案?

+0

你介意共享显示row_number()不执行的文章... – 2010-03-15 04:13:58

+0

除了最琐碎的查询之外,所有的查询都需要索引和最新的统计信息才能正常运行。 – 2010-03-15 04:22:17

+0

Duplicate:http://stackoverflow.com/questions/1897436/row-number-over-not-fast-enough-with-large-result-set-any-good-solution – 2010-03-15 04:24:51

回答

18

我们使用row_number()的效果很好,并没有真正的性能问题。我们的分页查询的基本结构是这样的:

WITH result_set AS (
    SELECT 
    ROW_NUMBER() OVER (ORDER BY <ordering>) AS [row_number], 
    x, y, z 
    FROM 
    table 
    WHERE 
    <search-clauses> 
) SELECT 
    * 
FROM 
    result_set 
WHERE 
    [row_number] BETWEEN a AND b 

它工作正常,我们用> 1,000,000行的表。

+0

我的理解是性能是服务器负载和服务器资源等的一个函数,请参阅上述备注中的两个链接pov – Kumar 2010-03-16 00:55:04

+2

正如我所说的,我们实际在具有> 1,000,000条记录的表中使用此功能。结果在<100ms内返回(当然取决于搜索条件)。当然,性能将成为服务器负载的一个函数,也是您特定的使用场景。 – 2010-03-16 01:05:43

+1

我想你有足够数量的RAM,以便表格被完全缓存。我只是试着用一个简单的表'人(电子邮件,名字,姓氏)'包含3.000.000记录,但分页到最后记录需要6秒以上的查询。我正在使用sql server 2008 r2。我错过了什么。 – broadband 2013-12-27 11:34:22