愤怒的大鸟 发表于 2015-1-16 22:40:04

MSSQL网页设计分页存储历程,综合了NOT_IN和SET ROW...

优化的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公司的另一个数据库项目。

飘灵儿 发表于 2015-1-19 21:07:47

呵呵,这就是偶想说的

仓酷云 发表于 2015-1-28 08:42:17

无法深入到数据库系统层面去了解和探究

若天明 发表于 2015-2-5 14:34:22

我是新手,正在学习数据库和操作系统,深感理论的泛广,唯有一步一步来,但是又感觉时间不够,收集了很多资料却总是没能认真的看完,希望有一个讨论板块,大家共同解决,共同分享,共同努力

柔情似水 发表于 2015-2-12 06:51:35

比如,MicrosoftSQLServer2008的某一个版本可以满足现在的这个业务的需要,而且价格还比Oracle11g要便宜,那么这一产品就是适合的。

透明 发表于 2015-3-2 23:50:23

索引视图2k就有。但是2005对其效率作了一些改进但是schema.viewname的作用域真是太限制了它的应用面。还有一大堆的环境参数和种种限制都让人对它有点却步。

飘飘悠悠 发表于 2015-3-11 07:37:49

XML字段类型更好的解决了XML数据的操作。XQuery确实不错,但是个人对其没好感。(CSDN的开发者应该是相当的熟了!)

精灵巫婆 发表于 2015-3-17 23:10:21

SP4包括用于以下SQLServer2000组件的程序包:Database组件(下载文件:SQL2000-KB884525-SP4-x86.EXE)更新SQLServer2000的32位Database组件,包括数据库引擎、复制、客户端连接组件及工具。有关其他信息,请参阅ReadmeSql2k32Sp4.htm。AnalysisServices组件(下载文件:SQL2000.AS-KB884525-SP4-x86.EXE)更新SQLServer2000的32位AnalysisServices。

海妖 发表于 2015-3-17 23:10:22

学习SQL语言的话如果要学会去做网站就不是很难!但是要做数据库管理的话就有难度了!

谁可相欹 发表于 2015-3-25 07:02:07

从项目平台的选择上讲,我们关心的,应该是一款产品能不能满足任务需求,而不是网上怎么说。
页: [1]
查看完整版本: MSSQL网页设计分页存储历程,综合了NOT_IN和SET ROW...