Mybatis中SqlServer分页解锁查询,SqlServer分页查询的五种方式

本人现在用的

需要到排序必须加 top 100 percent,不然会报错

select * from (
	select top 100 percent row_number() over(order by id) as num, id, name from user WITH(NOLOCK) 
) as tab where num between 1 and 30

说明
根据id排序后生成的序列号

row_number() over(order by id) as num

SqlServer中不像MySQL有行锁,SqlServer每次更新数据执行事务的时候就会直接锁表,
在其他的地方的查询就需要等待更新完成才能执行;为了在查询的时候不锁表,
在表或虚表后面加入如下即可

WITH(NOLOCK)

这里num是生成的视图里的序列号,根据这个序列号就可以分页了
这里是从1条开始查询到第30条的数据

num BETWEEN 1 END 30

实例说明
mybatis的XML中

select * from (
	select top 100 percent row_number() over(order by id) as num, id, name from user WITH(NOLOCK) 
) as tab where num between #{page} and #{limit}

Java代码中

int pages = ((user.getLimit() * user.getPage()) + 1) - user.getLimit();
int limit = user.getLimit() * user.getPage();
user.setPage(pages);
user.setLimit(limit);

分页说明:

起始值:从显示数乘以页数加一后再减去页显示数
例如:
1页显示30
30x1+1-30=1
2页显示30
30x2+1-30=31

结束值:第几页乘以页显示数
1页显示30
30x1=30
2页显示30
30x2=60

页显示数可为:奇数、偶数
下面列出几种方式

---方法一
select * from (
	select row_number() over(order by sid) as num, * from scan WITH(NOLOCK)
) as tab where num BETWEEN 10001 AND 10010

---方法二
select top 10 * from (
	select row_number() over(order by sid) as num, * from scan WITH(NOLOCK)
) as tab where num > 10010

---方法三
select top 10 * from scan WITH(NOLOCK) where sid >= (
	select max(sid) from (
		select top 10011 sid from scan WITH(NOLOCK) order by  sid asc
	) temp_max_ids
) order by sid;

---方法四
select * from (
	select top 10 * from (
		select top 10020 * from scan WITH(NOLOCK) order by sid asc 
	)as temp_sum_student order by sid desc 
) temp_order order by sid asc

---方法五
select top 10 * from  scan WITH(NOLOCK) where sid not in(
	select top 10010 * from scan WITH(NOLOCK) order by sid asc 
) order by sid asc 

查询2500W条数据的表
方法一
Mybatis中SqlServer分页解锁查询,SqlServer分页查询的五种方式_第1张图片
方法二
Mybatis中SqlServer分页解锁查询,SqlServer分页查询的五种方式_第2张图片

方法三
Mybatis中SqlServer分页解锁查询,SqlServer分页查询的五种方式_第3张图片

方法四、方法五
Mybatis中SqlServer分页解锁查询,SqlServer分页查询的五种方式_第4张图片
方式一改成这个样子后速度快了许多,由于sid索引的原因吧,就是嵌套子查询有点麻烦

select sid,sysid,inout,scantime,mac,gxdate from scan WITH(NOLOCK) where sid in (
	select sid from (
		select row_number() over(order by sid) as num,* from scan WITH(NOLOCK)
	) as tab where num BETWEEN 10001 AND 10010
)

Mybatis中SqlServer分页解锁查询,SqlServer分页查询的五种方式_第5张图片
优化的话就根据日期、索引查询,之后就是分区了

你可能感兴趣的:(数据库,后端,sql,数据库)