T-sql:如何执行优化分页?

2023-11-24

我编写了以下代码,它工作正常,但如果表包含一百万条记录,则需要 3 秒才能完成。有没有办法优化以下代码。

DBCC DROPCLEANBUFFERS; 
DBCC FREEPROCCACHE;

DECLARE @Page_Size int;
DECLARE @Page_Number int;
DECLARE @Lower_Bound int;
DECLARE @Upper_Bound int;

SET @Page_Size = 30;
SET @Page_Number = 30000;
SET @Lower_Bound = (@Page_Number - 1) * @Page_Size;
--SET @Upper_Bound = @Page_Number * @Page_Size;


WITH Customers AS--(Row_Numbr, Record_Id, First_Name, 
        Middle_Name, Last_Name, Email, Telephone) AS 
(

    SELECT ROW_NUMBER() 
        OVER 
         (ORDER BY Account.Customer.Record_Id) AS Row_Numbr, * 
    FROM Account.Customer 
)

SELECT top(@Page_Size) * 
FROM Customers 
WHERE Row_Numbr > @Lower_Bound-- 
    AND Row_Numbr <= @Upper_Bound -- This is suppose to be faster
--SELECT * FROM Customers 
--WHERE Row_Numbr > @Lower_Bound  
--   AND Row_Numbr <= @Upper_Bound

一、为什么DBCC DROPCLEANBUFFERS;?这是缓冲池的硬冷重置。除非您想测量和调整硬盘驱动器 IO 性能,否则没有人关心冷缓存的性能。这是not您的系统将如何工作。缓冲池中的缓存页是the数据库中最关键的性能方面,你可以把它去掉。这就像开着一辆没有引擎的法拉利出现并询问为什么这么慢。对于性能测量,您应该准确执行以下操作opposite:运行查询 4-5 次以预热缓存,然后进行测量。

其次,你的表结构是什么?是表吗Account.Customer表簇索引排序依据Record_id?如果不是,无论您如何表达 T-SQL,您都永远无法获得您想要的性能。

最后但并非最不重要的一点是,您有什么系统?是否有足够的 RAM 将整个数据库缓存在内存中?如果没有,请购买更多内存。是否有其他进程竞争内存,例如 IIS/Asp?如果是,将他们踢到他们自己的服务器上,你应该曾经在与 Web 服务器相同的主机上运行数据库如果性能很重要。

对于替代的快速分页,请考虑键集驱动的解决方案:

/* moving up */
SELECT top(@Page_Size) * 
FROM Account.Customer  
WHERE Record_Id > @lastPageRecordId
ORDER BY Record_Id;

/* moving down */
SELECT top(@Page_Size) * 
FROM Account.Customer  
WHERE Record_Id < @firstPageRecordId
ORDER BY Record_Id DESC;

键集驱动的解决方案可以直接查找最后一个位置,然后使用聚集索引键位置对下一页/上一页进行范围扫描。分页逻辑(状态)必须记住正在显示的页面上的最后一个和第一个键,以便从那里继续,而不是记住页码。

基于行计数的解决方案(以及 MySQL 中的 LIMIT)比基于键集的解决方案效率低,因为它们总是必须计算记录数来定位自己,而不是像键集那样直接查找位置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

T-sql:如何执行优化分页? 的相关文章

随机推荐