存储过程:create Procedure pname
创新互联公司2013年至今,先为武定等服务建站,武定等地企业,进行企业商务咨询服务。为武定企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
( @pageIndex int,@pageSize)
as
select * from tableName order by id
offset @pageIndex * pageSize fetch next pageSize rows only
分页:
sqlserver 在2008之前 使用 top 和 not int top 的方式来做分页
2008以后使用 row_number() 函数作为分页关键函数
2012使用 offset 1 fetch next 10 rows only
你问了2个问题,你可以优先把视图,存储过程,触发器等弄明白,分页是查询,在存储过程里可以写复杂的sql文,只是在运行时是预编译和参数化查询防止sql注入
尽量不要使用嵌套子查询,优先使用连接子查询;
In 关键字尽量少使用,效率低,除非 in 包含的信息量非常少,并且叫固定;
如果查询条件和查询结果表无直接关联,优先根据查询条件查询出符合条件的临时结果值,然后和最终结果表关联;
除 top n 方式分页之外,使用 row_number() over 方式分页也可以;
能明确指定结果字段的,尽量不要用 * ;
不相关的字段可以省略;
如果最终结果表数据比较大,考虑分表,分区,分库;
查询结果表字段尽量不要包含大文本之类的字段;
where 条件中对于varchar 字段 的 like 查询要适度,不要用太多,会影响效率;
存储过程:create Procedure pname
( @pageIndex int,@pageSize)
as
select * from tableName order by id
offset @pageIndex * pageSize fetch next pageSize rows only
分页:
sqlserver 在2008之前 使用 top 和 not int top 的方式来做分页
2008以后使用 row_number() 函数作为分页关键函数
2012使用 offset 1 fetch next 10 rows only
你问了2个问题,你可以优先把视图,存储过程,触发器等弄明白,分页是查询,在存储过程里可以写复杂的sql文,只是在运行时是预编译和参数化查询防止sql注入
临近春节,心早已飞了不在工作上了,下面小编给大家整理些数据库的几种分页查询。
Sql
Sever
2005之前版本:
select
top
页大小
*
from
表名
where
id
not
in
(
select
top
页大小*(查询第几页-1)
id
from
表名
order
by
id
)
order
by
id
例如:
select
top
10
*
--10
为页大小
from
[TCCLine].[dbo].[CLine_CommonImage]
where
id
not
in
(
--40是这么计算出来的:10*(5-1)
--
页大小*(查询第几页-1)
select
top
40
id
from
[TCCLine].[dbo].[CLine_CommonImage]
order
by
id
)
order
by
id
结果为:
Sql
Sever
2005及以上版本,多了个分页查询方法:
/*
*
firstIndex:起始索引
*
pageSize:每页显示的数量
*
orderColumn:排序的字段名
*
SQL:可以是简单的单表查询语句,也可以是复杂的多表联合查询语句
*/
select
top
pageSize
o.*
from
(select
row_number()
over(order
by
orderColumn)
as
rownumber,*
from(SQL)
as
o
where
rownumberfirstIndex;
例如:
select
top
10
numComImg.*
from
(
select
row_number()
over(order
by
id
asc)
as
rownumber,*
from
(select
*
FROM
[TCCLine].[dbo].[CLine_CommonImage])
as
comImg)
as
numComImg
where
rownumber40
结果:
这两个方法,就仅仅是多了一列
rewnumber
吗?当然不是,来看下内部差别吧:
在两个SQL上,分别加入以下SQL,并使用MS的“包括执行计划”,便于查看执行详情:
SET
STATISTICS
TIME
ON
GO
要执行的SQL:
SET
STATISTICS
TIME
ON
GO
select
top
10
numComImg.*
from
(
select
row_number()
over(order
by
id
asc)
as
rownumber,*
from
(select
*
FROM
[TCCLine].[dbo].[CLine_CommonImage])
as
comImg)
as
numComImg
where
rownumber40
SET
STATISTICS
TIME
ON
GO
select
top
10
*
--10
为页大小
from
[TCCLine].[dbo].[CLine_CommonImage]
where
id
not
in
(
--40是这么计算出来的:10*(5-1)
--
页大小*(查询第几页-1)
select
top
40
id
from
[TCCLine].[dbo].[CLine_CommonImage]
order
by
id
)
order
by
id
执行之后,查看执行计划:
看得出,两个同样功能的SQL,执行时,使用
row_number()
的,要比是用
纯TOP方式的,查询开销少得多,上图显示
28:72,纯top方式,使用了两次聚集扫描。
再来看下执行时间信息:
row_number()方式的:
纯top方式:
相比之下,还是row_number()解析函数效率比较高写。
以上所述是小编给大家分享的SQLSERVER分页查询关于使用Top方式和row_number()解析函数的不同,希望对大家有所帮助。