Sql server 2005 Sql Server分页问题
朋友们 我已经在我的SP中实现了分页-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子
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没有太多的了解,因为我基本上是一名开发人员。