|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
优化的SQL查询算法,有效地提高查询速度存储历程|分页
分页存储历程,本人把“NOT_IN”和“SETROWCOUNT”两种体例综合了一下。
“SETROWCOUNT”算法稳定,“NOT_IN”排序时加了主键字段,如许速率提拔了良多并且了局是单向独一的,但不是双向可逆的。“SETROWCOUNT”没有速率成绩,“NOT_IN”排序加了主键字段后在30W纪录时对非索引字段、非聚合字段的排序翻一页不外3秒钟,还能够吧:P
----------------------
CREATEPROCEDUREPaging_Custom
(
@Tablesvarchar(1000),
@PKvarchar(100),
@Sortvarchar(200)=NULL,
@isAscendingbit=1,
@PageNumberint=1,
@PageSizeint=10,
@Fieldsvarchar(1000)=*,
@Filtervarchar(1000)=NULL,
@Groupvarchar(1000)=NULL)
AS
/*DefaultSorting*/
IF@SortISNULLOR@Sort=
SET@Sort=@PK
/*Findthe@SORTtype*/
DECLARE@strFiltervarchar(1000)
DECLARE@strSimpleFiltervarchar(1000)
DECLARE@strGroupvarchar(1000)
DECLARE@SortTablevarchar(100)
DECLARE@SortNamevarchar(100)
DECLARE@strPKColumnvarchar(200)
DECLARE@strSortColumnvarchar(200)
DECLARE@operatorchar(2)
/*Setfilter&groupvariables.*/
IF@FilterISNOTNULLAND@Filter!=
BEGIN
SET@strFilter=WHERE+@Filter+
SET@strSimpleFilter=AND+@Filter+
END
ELSE
BEGIN
SET@strSimpleFilter=
SET@strFilter=
END
IF@GroupISNOTNULLAND@Group!=
SET@strGroup=GROUPBY+@Group+
ELSE
begin
SET@strGroup=
end
/*count*/
exec(selectcount(*)from+@Tables++@strFilter)
/*Setsortingvariables.*/
SET@strSortColumn=@Sort
/*operatorandasc_desc*/
declare@strAsc_Desvarchar(10)
IF@isAscending=0
BEGIN
SET@operator=<=
SET@strAsc_Des=Desc
END
ELSE
BEGIN
SET@operator=>=
SET@strAsc_Des=ASC
END
IFCHARINDEX(.,@PK)>0
BEGIN
SET@strPKColumn=SUBSTRING(@PK,0,CHARINDEX(.,@PK))
END
ELSE
BEGIN
SET@strPKColumn=@PK
END
IFCHARINDEX(.,@strSortColumn)>0
BEGIN
SET@SortTable=SUBSTRING(@strSortColumn,0,CHARINDEX(.,@strSortColumn))
SET@SortName=SUBSTRING(@strSortColumn,CHARINDEX(.,@strSortColumn)+1,LEN(@strSortColumn))
END
ELSE
BEGIN
SET@SortTable=@Tables
SET@SortName=@strSortColumn
END
/*Handlercomplextable*/
--Bejointable,sogetthelefttable
IFCHARINDEX(join,@Tables)>0
BEGIN
SET@SortTable=SUBSTRING(ltrim(@Tables),0,CHARINDEX(,@Tables))
SET@strSortColumn=@SortTable+.+@SortName
END
/*CheckthesortColumnifbeUnique*/
DECLARE@tempNamevarchar(100)
IF@SortName@strPKColumn
begin
SELECT@tempName=b.name
FROMsysobjectsaINNERJOIN
sysobjectsbONa.id=b.parent_obj
INNERJOINsysindexescONb.name=c.nameINNERJOIN
sysindexkeysdONc.id=d.idANDc.indid=d.indidINNERJOIN
syscolumnseONd.id=e.idANDd.colid=e.colid
WHERE(b.xtype=UQ)AND(a.name=@SortTable)AND(e.name=@SortName)
IF@tempNameISNULLGOTO:Paging_Not_In
end
DECLARE@typevarchar(100)
DECLARE@precint
SELECT@type=t.name,@prec=c.prec
FROMsysobjectso
JOINsyscolumnscono.id=c.id
JOINsystypestonc.xusertype=t.xusertype
WHEREo.name=@SortTableANDc.name=@SortName
/*Thelefttabledoesntcontainsortcolumn*/
--IF@typeisnullor@type=Goto:Paging_Not_In
IFCHARINDEX(char,@type)>0
SET@type=@type+(+CAST(@precASvarchar)+)
DECLARE@strPageSizevarchar(50)
DECLARE@strStartRowvarchar(50)
/*DefaultPageNumber*/
IF@PageNumber<1
SET@PageNumber=1
/*Setpagingvariables.*/
SET@strPageSize=CAST(@PageSizeASvarchar(50))
SET@strStartRow=CAST(((@PageNumber-1)*@PageSize+1)ASvarchar(50))
/*Executedynamicquery*/
EXEC(DECLARE@SortColumn+@type+
SETROWCOUNT+@strStartRow+
SELECT@SortColumn=+@strSortColumn+FROM+@Tables+@strFilter++@strGroup+
ORDERBY+@Sort+@strAsc_Des+SETROWCOUNT+@strPageSize+
SELECT+@Fields+FROM+@Tables+WHERE+@strSortColumn+@operator+@SortColumn+
@strSimpleFilter++@strGroup+ORDERBY+@Sort+@strAsc_Des
)
return
Paging_Not_In:
--DECLARE@strPageSizevarchar(50)
--SET@strPageSize=CAST(@PageSizeASvarchar(50))
declare@strTotalNumint
SET@strTotalNum=(@PageNumber-1)*@PageSize
--第一页
--Declare@strSQLvarchar(8000)
IF@strTotalNum=0
begin
exec(selecttop+@PageSize++@Fields+from+@Tables++@strFilter+@strGroup+ORDERBY+@Sort+@strAsc_Des)
end
else
begin
exec(selecttop+@PageSize++@Fields+from+@Tables+where
+@PK+notin(selecttop
+@strTotalNum++@PK+from+@Tables++@strFilter+@strGroup+
ORDERBY+@Sort+@strAsc_Des
+)+@strSimpleFilter+@strGroup+ORDERBY+@Sort+@strAsc_Des)
end
GO
2008年1月16号MySQLAB被Sun公司收购。而2009年,SUN又被Oracle收购。就这样如同一个轮回,MySQL成为了Oracle公司的另一个数据库项目。 |
|