SQL SERVER 大数据的分页【测】

我用五百万的数据来测试,有兴趣的大家可以试试千万级的;

1、先添加大量数据

    SQL SERVER 百万级数据测试【测】

2、普通 分页

A、ROW_NUMBER()OVER

SELECT  *
FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY T.UserID ) AS row ,
                    *
          FROM      Users AS T
        ) AS TT
WHERE   TT.row BETWEEN 999000 AND 1000000;

测:【百万级】第一页时间:126MS, 100W的时间 1073MS, 接近第一页10倍,500W的时间 4863MS 100W的4.5倍,第一页的38倍。

B、两次TOP分页 

SELECT TOP 1000 *
FROM    Users
WHERE   UserID NOT IN ( SELECT TOP ( 1000 * ( 5000 - 1 ) )
                                UserID
                        FROM    Users
                        ORDER BY UserID )
ORDER BY UserID; 

 测:【百万级】第一页时间:140MS, 100W的时间 1190MS,500W的时间 5526MS 100W的5倍,第一页的39倍。

 为什么我测试的获取(500W)时,TOP  TOP 要比ROW_NUMBER()效率更好一些呢? 

 最起码:100W以内的数据可以采用ROW_NUMBER()这样的分页,更优雅效率也稍微好一些,勉强可以接受的,数据再大些,如何优化代码也无济于事的,这牵扯的是数据库的计算能力,类似这两种的都PASS。

3、优化分页(第一次)采用 WITH

 

UserID 为自增主键,已建立非聚集索引

 

WITH TT AS(
    SELECT    ROW_NUMBER() OVER ( ORDER BY T.UserID ) AS row ,
        T.UserID    
    FROM      Users AS T  WITH (NOLOCK )
)

SELECT TT.*,A.UserID FROM Users A WITH ( NOLOCK )
    INNER JOIN TT ON A.UserID=TT.UserID
WHERE   TT.row BETWEEN 4999000 AND 5000000;

测:500W的时间 886MS  相比前两种缩短了6倍的时间。· 优~~~

PS:目前只是简单的单表,如果多表联合查询数据会更明显。

原因是采用WITH,预先构造临时表TT,减少全表扫描次数( 前两种表会被扫描两次、WITH仅被扫描一次 ),所以大大降低了查询的时间,降低消耗。

执行计划:

SQL SERVER 大数据的分页【测】_第1张图片

4、优化分页(第二次)游标

 

你可能感兴趣的:(SQL SERVER 大数据的分页【测】)