千万数量级分页存储过程,可支持多表查询,任意排序_第1页
千万数量级分页存储过程,可支持多表查询,任意排序_第2页
千万数量级分页存储过程,可支持多表查询,任意排序_第3页
千万数量级分页存储过程,可支持多表查询,任意排序_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、从程序中考虑:比如用数据缓冲和连接池技术 从数据库服务器端考虑:比如csdn只选出前300行纪录,因为用户不需要那么多纪录。你也不必把1000万条全部分页。你也不必把纪录放在一个表中,一年(太多就一个月)的数据放一张表或定期把历史数据导出到数据数据仓库中,不要用一张表装1000万条记录。做好索引。优化查询!尽量少用模糊查询,避免表扫描。不能让客户端连续多次搜索(csdn就是)千万级的数据库,有分页的意义吗?对于用户来说就是信息的海洋了,去看看Google怎么做的吧, 根本就不存在如何分页的问题,如果一个结果有千万条,那跟没有结果一样是没有一样.应该是统计条数,取出,前N条进行分页,如果到地还在

2、准备分页的话,再次取结果n,进行分页.并且在其间推荐用户进行递进式搜索,来降低信息量,才式正确的我有一个方法:(对于喜欢用select * 的同行可能有用) 先检索出来,符合条件的所有 id (唯一标识)放在内存里 然后根据当前页数和每页多少行纪录 去内存中取 id号的当前集 根据当前集 中的某一条 去数据库中检索相应的数据行 这里建议使用编译预处理PrepareStatement 将结果放进数据类 (如果你的数据只有两列当然可以省略这一步) 然后把数据类添加进 ArrayList 或者HashMap 然后 把载页面上输出 ArrayList 或者HashMap 的数据 这样做,是因为只检索一

3、列数据 要比检索多类要快得多 占用更少的内存。 一次只精确定位一条纪录 要比一次取出多条要快,这里的瓶颈在于频繁的与数据库交互,但是我们使用编译预处理可以很大程度上提高性能。千万数量级分页存储过程(可支持多表查询,任意排序)功能不错的分页存储过程,可支持多表查询,任意排序CreatePROCEDUREusp_PagingLargeTableNamesVARCHAR(200),-表名,可以是多个表,但不能用别名PrimaryKeyVARCHAR(100),-主键,可以为空,但Order为空时该值不能为空FieldsVARCHAR(200),-要取出的字段,可以是多个表的字段,可以为空,为空表示s

4、elect*PageSizeINT,-每页记录数CurrentPageINT,-当前页,0表示第1页FilterVARCHAR(200)='',-条件,可以为空,不用填whereGroupVARCHAR(200)='',-分组依据,可以为空,不用填groupbyOrderVARCHAR(200)=''-排序,可以为空,为空默认按主键升序排列,不用填orderbyASBEGINDECLARESortColumnVARCHAR(200)DECLAREOperatorCHAR(2)DECLARESortTableVARCHAR(200)DECLARES

5、ortNameVARCHAR(200)IFFields=''SETFields='*'IFFilter=''SETFilter='Where1=1'ELSESETFilter='Where'+FilterIFGroup<>''SETGroup='GROUPBY'+GroupIFOrder<>''BEGINDECLAREpos1INT,pos2INTSETOrder=REPLACE(REPLACE(Order,'asc','

6、;ASC'),'desc','DESC')IFCHARINDEX('DESC',Order)>0IFCHARINDEX('ASC',Order)>0BEGINIFCHARINDEX('DESC',Order)<CHARINDEX('ASC',Order)SETOperator='<='ELSESETOperator='>='ENDELSESETOperator='<='ELSESETOperator='

7、;>='SETSortColumn=REPLACE(REPLACE(REPLACE(Order,'ASC',''),'DESC',''),'','')SETpos1=CHARINDEX(',',SortColumn)IFpos1>0SETSortColumn=SUBSTRING(SortColumn,1,pos1-1)SETpos2=CHARINDEX('.',SortColumn)IFpos2>0BEGINSETSortTable=SUBS

8、TRING(SortColumn,1,pos2-1)IFpos1>0SETSortName=SUBSTRING(SortColumn,pos2+1,pos1-pos2-1)ELSESETSortName=SUBSTRING(SortColumn,pos2+1,LEN(SortColumn)-pos2)ENDELSEBEGINSETSortTable=TableNamesSETSortName=SortColumnENDENDELSEBEGINSETSortColumn=PrimaryKeySETSortTable=TableNamesSETSortName=SortColumnSETOr

9、der=SortColumnSETOperator='>='ENDDECLAREtypevarchar(50)DECLAREprecintSelecttype=,prec=c.precFROMsysobjectsoJOINsyscolumnscono.id=c.idJOINsystypestonc.xusertype=t.xusertypeW=SortTableAND=SortNameIFCHARINDEX('char',type)>0SETtype=type+'('+CAST(precAS

10、varchar)+')'DECLARETopRowsINTSETTopRows=PageSize*CurrentPage+1printTopRowsprintOperatorEXEC('DECLARESortColumnBegin'+type+'SETROWCOUNT'+TopRows+'SelectSortColumnBegin='+SortColumn+'FROM'+TableNames+''+Filter+''+Group+'orDERBY'+Order+

11、9;SETROWCOUNT'+PageSize+'Select'+Fields+'FROM'+TableNames+''+Filter+'AND'+SortColumn+''+Operator+'SortColumnBegin'+Group+'orDERBY'+Order+'')ENDGO-调用例子:-1.单表/单排序EXECusp_PagingLarge'bigtable','d_id','d_id,d_title,d

12、_content,d_time',20,1,'','','d_iddesc'-2.单表/多排序EXECusp_PagingLarge'bigtable','d_id','*',20,0,'','','d_timeasc,d_iddesc'-3.多表/单排序EXECusp_PagingLarge'bigtableleftjoinbigtable_authoronbigtable.d_id=bigtable_author.BigTable_id','bigtable.d_id','bigtable.d_id,bigtable.d_title,bigtable.d_content,bigtable.d_time,bigtable_author.d_author',20,0,'','','bigtable.d_idasc'-4.多表/多排序EXECusp_PagingLarge'bigtableleftjoinbigtable_authoronbigtable.d_id=bigtable_author.BigTable_id

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论