Sql server 2005 Sql Server分页问题

Sql server 2005 Sql Server分页问题,sql-server-2005,stored-procedures,Sql Server 2005,Stored Procedures,朋友们 我已经在我的SP中实现了分页- with MyData As ( select ROW_NUMBER() over (order by somecolumn desc) AS [Row], x,y,z,... ) Select x,y,z,... From MyData Where [Row] between ((@currentPage - 1) * @pageSize + 1) and (@currentPage*@pageSize) 这里的问题是,如果with子

朋友们

我已经在我的SP中实现了分页-

with MyData As (
    select ROW_NUMBER() over (order by somecolumn desc) AS [Row], 
    x,y,z,...
)
Select x,y,z,...
From MyData
Where [Row] between ((@currentPage - 1) * @pageSize + 1) and (@currentPage*@pageSize)
这里的问题是,如果
with
子句返回的行数较少,则会非常快地重试数据,但如果有数百万条记录,则需要很长时间。有时它会超时

还有其他选择吗


感谢您与我们分享宝贵的时间。

SQL server优化是一个非常广泛的主题,您发布的信息数量有限,很难解决这个问题。然而,由于您急于寻求解决方案,首先我建议检查您的实际执行计划,将其张贴在此处,并确保索引实际上是被使用的——如果不是这样的话,那么考虑使用FASFIFSTROW表提示来强制使用索引——检查和检查它如何改进事物以及它如何使事情变得更糟。

接下来考虑的是SQL参数嗅探-这不太可能来自您所说的,但可能在这里查看详细信息

要获得大规模性能提升,您可能需要查看架构更改,至少要确保事务日志与数据位于不同的磁盘上。将数据库文件与日志文件分开的原因是数据库访问是随机的,而日志访问是顺序的。最佳实践要求不要在同一磁盘上混合使用这两种I/O类型

此外,如果您有数以百万计的行,那么您确实需要考虑在多个磁盘上分割数据。


<>最后,我强烈地考虑表或索引< /p> 。查询的速度慢的原因是,在每个请求上都对整个表进行排序。为了显著提高速度,您需要避免以CPU、HDD/内存或分页逻辑限制为代价对大量数据进行排序

<> P>因为你的表被排序的信息不多,如果你经常插入中间/删除条目,我会通过做出这些假设来缩小你的问题:

  • 我会想象你有一个存储文章档案的表格。新条目大多位于表的底部,来自表中间的条目很少被删除

  • 您总是按照相同的列
    somecolumn
    进行排序,并按照相同的顺序进行排序,例如降序

  • 您没有任何用户输入的筛选器(如文章标题或作者)

  • 这使得表在输出方面是静态的:除非插入新的项目,否则每个项目都将位于同一位置。新的到达你的输出的顶端。然后可以将()上的
    行编号()存储为列。一个更方便的解决方案是一个
    IDENTITY
    列。如果您在此列上创建聚集索引,将加快速度

    alter table add [Record_Number] int null IDENTITY 
    
    此新列被添加为
    null
    ,因此您可以第一次填充值。然后您可以使其
    不为空

    另一方面,您可以通过

    select @Max_Row =  SELECT MAX(row_number) from MyTable
    
    现在,当您拥有总行数、页面大小和页码时,您可以在一条语句中选择所需的行,而无需对整批进行排序

    Select * From MyTable 
    Where row_number between 
        (@Max_Row - @Page * @Page_Size) + 1 AND
         @Max_Row -(@Page - 1) * @Page_Size
    

    如果您的CTE中确实有一个过滤器,那么请提供有关数据结构的更多信息,以便我们可以想出一种方法来限制CTE的范围。

    是否在
    somecolumn
    上有索引?是的,Damien!感谢您的快速回复。您需要随机或按顺序访问页面吗?@il_guru:在aspx页面上随机使用寻呼机。您是使用同一列拆分页面还是使用不同的列拆分页面?如果主查询中没有使用列
    x、y、z..
    ,那么在
    CTE
    中是否确实需要列
    x、y、z..
    ?你能在你用来给页面编号的
    somecolumn
    上建立一个聚集索引吗?很好的解释,谢谢!让我看看它是否对我有效。谢谢约翰,谢谢。你提供了我不知道的有价值的信息。我对SQL Server没有太多的了解,因为我基本上是一名开发人员。