sqlserver关于分页存储过程的优化【让数据库按我

网络编程 2025-03-13 13:00www.168986.cn编程入门

在对两段分页SQL代码进行对比之前,我们先来了解一下背景。假设我们有一个包含15万条记录的news表,其中NewsTypeId=10的有9万条记录。当前我们正在查询NewsTypeId=10的数据,并试图通过分页的方式获取其中的部分数据。

接下来,我们来分析这两段代码:

代码一:

1. 通过`WITH(NOLOCK)`选项,查询新闻数据并创建一个临时表tb。

2. 使用`ROW_NUMBER()`函数为结果集分配行号。

3. 根据给定的页码和每页的数量筛选出需要的数据。

4. 执行一个全表扫描来从news表中获取新闻ID。

存在的问题是,随着页码的增大,全表扫描的开销会越来越大,导致效率降低。加粗部分的代码确实进行了整表扫描,这可能是因为数据库引擎认为WHERE表达式中的条件不足以进行更有效的查询优化。

代码二:

1. 同样使用`WITH(NOLOCK)`选项和`ROW_NUMBER()`函数创建一个临时表tb。

2. 从临时表中筛选出需要的新闻ID并存入另一个临时表tb2。

3. 使用IN子句从news表中获取实际的新闻数据。

与代码一相比,代码二避免了全表扫描,因为它首先筛选出需要的新闻ID(通过临时表tb),然后再从news表中获取实际的新闻数据。这意味着它只需要对news表进行一次扫描,而不是多次。随着页码的变化,代码二的效率相对稳定,不会像代码一那样随着页码的增大而降低效率。

从执行计划来看,代码二的IO操作数大大降低,这进一步证明了其更高的效率。代码二中的聚焦索引查找也提高了性能。基于以上分析,代码二的效率远远高于代码一。

Copyright © 2016-2025 www.168986.cn 狼蚁网络 版权所有 Power by