|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
导致了一个使用几乎和mSQL一样的API接口的用于他们的数据库的新的SQL接口的产生,这样,这个API被设计成允许为用于mSQL而写的第三方代码更容易移植到MySQL。server|存储历程|分页
SQLServer存储历程的分页,这个成绩已会商过几年了,良多伴侣在问我,以是在此宣布一下我的概念
创建表:
CREATETABLE[TestTable](
[ID][int]IDENTITY(1,1)NOTNULL,
[FirstName][nvarchar](100)COLLATEChinese_PRC_CI_ASNULL,
[LastName][nvarchar](100)COLLATEChinese_PRC_CI_ASNULL,
[Country][nvarchar](50)COLLATEChinese_PRC_CI_ASNULL,
[Note][nvarchar](2000)COLLATEChinese_PRC_CI_ASNULL
)ON[PRIMARY]
GO
拔出数据:(2万条,用更多的数据测试会分明一些)
SETIDENTITY_INSERTTestTableON
declare@iint
set@i=1
while@i<=20000
begin
insertintoTestTable([id],FirstName,LastName,Country,Note)values(@i,FirstName_XXX,LastName_XXX,Country_XXX,Note_XXX)
set@i=@i+1
end
SETIDENTITY_INSERTTestTableOFF
-------------------------------------
分页计划一:(使用NotIn和SELECTTOP分页)
语句情势:
SELECTTOP10*
FROMTestTable
WHERE(IDNOTIN
(SELECTTOP20id
FROMTestTable
ORDERBYid))
ORDERBYID
SELECTTOP页巨细*
FROMTestTable
WHERE(IDNOTIN
(SELECTTOP页巨细*页数id
FROM表
ORDERBYid))
ORDERBYID
-------------------------------------
分页计划二:(使用ID年夜于几和SELECTTOP分页)
语句情势:
SELECTTOP10*
FROMTestTable
WHERE(ID>
(SELECTMAX(id)
FROM(SELECTTOP20id
FROMTestTable
ORDERBYid)AST))
ORDERBYID
SELECTTOP页巨细*
FROMTestTable
WHERE(ID>
(SELECTMAX(id)
FROM(SELECTTOP页巨细*页数id
FROM表
ORDERBYid)AST))
ORDERBYID
-------------------------------------
分页计划三:(使用SQL的游标存储历程分页)
createprocedureXiaoZhengGe
@sqlstrnvarchar(4000),--查询字符串
@currentpageint,--第N页
@pagesizeint--每页行数
as
setnocounton
declare@P1int,--P1是游标的id
@rowcountint
execsp_cursoropen@P1output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcountoutput
selectceiling(1.0*@rowcount/@pagesize)as总页数--,@rowcountas总行数,@currentpageas以后页
set@currentpage=(@currentpage-1)*@pagesize+1
execsp_cursorfetch@P1,16,@currentpage,@pagesize
execsp_cursorclose@P1
setnocountoff
别的的计划:假如没有主键,能够用一时表,也能够用计划三做,可是效力会低。
倡议优化的时分,加上主键和索引,查询效力会进步。
经由过程SQL查询剖析器,显现对照:我的结论是:
分页计划二:(使用ID年夜于几和SELECTTOP分页)效力最高,必要拼接SQL语句
分页计划一:(使用NotIn和SELECTTOP分页)效力次之,必要拼接SQL语句
分页计划三:(使用SQL的游标存储历程分页)效力最差,可是最为通用
在实践情形中,要详细剖析。
更多的会商见:
http://community.csdn.net/Expert/topic/3292/3292678.xml?temp=.1621515
php本地模拟的prepare底层就是mysql_real_escape_string,所以必须得用mysql_set_character_set去设置mysql->charset,否则就存在字符集问题。 |
|