提高SQL的执行效率

上传人:2315****3hhg 文档编号:163199073 上传时间:2022-10-20 格式:DOCX 页数:49 大小:97.42KB
收藏 版权申诉 举报 下载
提高SQL的执行效率_第1页
第1页 / 共49页
提高SQL的执行效率_第2页
第2页 / 共49页
提高SQL的执行效率_第3页
第3页 / 共49页
资源描述:

《提高SQL的执行效率》由会员分享,可在线阅读,更多相关《提高SQL的执行效率(49页珍藏版)》请在装配图网上搜索。

1、着“金盾工程”建设的逐步深入和公安信息化的高速发展,公安计算机应用系统被广泛应用在各警种、各部门。与此同时,应用系统体系的核心、系统数据的存放地数据库也随着实际应用而急剧膨胀,一些大规模的系统,如人口系统的数据甚至超过了1000万条,可谓海量。那么,如何实现快速地从这些超大容量的数据库中提取数据(查询)、分析、统计以及提取数据后进行数据分页已成为各地系统管理员和数据库管理员亟待解决的难题。 在以下的文章中,我将以“办公自动化”系统为例,探讨如何在有着1000万条数据的MS SQL SERVER数据库中实现快速的数据提取和数据分页。以下代码说明了我们实例中数据库的“红头文件”一表的部分数据结构:

2、CREATE TABLE dbo.TGongwen ( -TGongwen是红头文件表名 GGid iint IDDENTTITYY (11, 11) NNOT NULLL ,-本本表的iid号,也也是主键键 ttitlle vaarchhar (880) COLLLATTE CChinnesee_PRRC_CCI_AAS NNULLL , -红红头文件件的标题题 ffariiqi ddateetimme NULLL ,-发发布日期期 nneibbuYoonghhu vaarchhar (770) COLLLATTE CChinnesee_PRRC_CCI_AAS NNULLL ,-发布布用户

3、 rreadder vvarccharr (9000) CCOLLLATEE Chhineese_PRCC_CII_ASS NUULL ,-需要浏浏览的用用户。每每个用户户中间用用分隔符符“,”分开) ON PRRIMAARY TEEXTIIMAGGE_OON PRIIMARRYGO下面,我们们来往数数据库中中添加110000万条数数据:declaare i inttset i=11whilee ii=22500000beginn iinseert intto TTgonngween(ffariiqi,neiibuyyongghu,reaaderr,tiitlee) vvaluues(2000

4、4-2-55,通信科科,通信科科,办公公室,王王局长,刘局长长,张局局长,aadmiin,刑刑侦支队队,特勤勤支队,交巡警警支队,经侦支支队,户户政科,治安支支队,外外事科,这这是最先先的255万条记记录) sset i=i+1endGOdeclaare i inttset i=11whilee ii=22500000beginn iinseert intto TTgonngween(ffariiqi,neiibuyyongghu,reaaderr,tiitlee) vvaluues(20004-9-116,办公公室,办公公室,通通信科,王局长长,刘局局长,张张局长,admmin,刑侦支支队,

5、特特勤支队队,交巡巡警支队队,经侦侦支队,户政科科,外事事科,这是是中间的的25万万条记录录) sset i=i+1endGOdeclaare h inttset h=11whilee hh=1100beginndeclaare i inttset i=220022whilee ii=220033beginndeclaare j intt sett jj=0 whiile j50 beeginndeclaare k intt seet k=00 whhilee kk500 beeginn iinseert intto TTgonngween(ffariiqi,neiibuyyongghu,re

6、aaderr,tiitlee) vvaluues(casst(i aas vvarccharr(4)+-8-15 3:+caast(j as varrchaar(22)+:+caast(j as varrchaar(22),通信信科,办公公室,通通信科,王局长长,刘局局长,张张局长,admmin,刑侦支支队,特特勤支队队,交巡巡警支队队,经侦侦支队,户政科科,外事事科,这是是最后的的50万万条记录录) seet k=k+11 enndset j=j+11 enddset i=i+11endset h=h+11endGOdeclaare i inttset i=11whilee ii datte

7、addd(dday,-900,geetdaate()用时:5337633毫秒(554秒)(3)将聚聚合索引引建立在在日期列列(faariqqi)上上:selecct ggid,farriqii,neeibuuyonnghuu,tiitlee frrom Tgoongwwenwheree faariqqi datteaddd(dday,-900,geetdaate()用时:24423毫毫秒(22秒)虽然每条语语句提取取出来的的都是225万条条数据,各各种情况况的差异异却是巨巨大的,特特别是将将聚集索索引建立立在日期期列时的的差异。事事实上,如如果您的的数据库库真的有有10000万容容量的话话,把

8、主主键建立立在IDD列上,就就像以上上的第11、2种种情况,在在网页上上的表现现就是超超时,根根本就无无法显示示。这也也是我摒摒弃IDD列作为为聚集索索引的一一个最重重要的因因素。得出以上速速度的方方法是:在各个个sellectt语句前前加:ddecllaree dd daatettimeeset d=ggetddatee()并在sellectt语句后后加:selecct 语句执执行花费费时间(毫秒)=ddateedifff(mms,d,ggetddatee()2、只要建建立索引引就能显显著提高高查询速速度事实上,我我们可以以发现上上面的例例子中,第第2、33条语句句完全相相同,且且建立索索引

9、的字字段也相相同;不不同的仅仅是前者者在faariqqi字段段上建立立的是非非聚合索索引,后后者在此此字段上上建立的的是聚合合索引,但但查询速速度却有有着天壤壤之别。所所以,并并非是在在任何字字段上简简单地建建立索引引就能提提高查询询速度。从建表的语语句中,我我们可以以看到这这个有着着10000万数数据的表表中faariqqi字段段有50003个个不同记记录。在在此字段段上建立立聚合索索引是再再合适不不过了。在在现实中中,我们们每天都都会发几几个文件件,这几几个文件件的发文文日期就就相同,这这完全符符合建立立聚集索索引要求求的:“既不能能绝大多多数都相相同,又又不能只只有极少少数相同同”的规则

10、则。由此此看来,我我们建立立“适当”的聚合合索引对对于我们们提高查查询速度度是非常常重要的的。3、把所有有需要提提高查询询速度的的字段都都加进聚聚集索引引,以提提高查询询速度上面已经谈谈到:在在进行数数据查询询时都离离不开字字段的是是“日期”还有用用户本身身的“用户名名”。既然然这两个个字段都都是如此此的重要要,我们们可以把把他们合合并起来来,建立立一个复复合索引引(coompooundd inndexx)。很多人认为为只要把把任何字字段加进进聚集索索引,就就能提高高查询速速度,也也有人感感到迷惑惑:如果果把复合合的聚集集索引字字段分开开查询,那那么查询询速度会会减慢吗吗?带着着这个问问题,我

11、我们来看看一下以以下的查查询速度度(结果果集都是是25万万条数据据):(日日期列ffariiqi首首先排在在复合聚聚集索引引的起始始列,用用户名nneibbuyoonghhu排在在后列)(1)seelecct ggid,farriqii,neeibuuyonnghuu,tiitlee frrom Tgoongwwen wheere farriqii220044-5-5 查询速度:25113毫秒秒(2)seelecct ggid,farriqii,neeibuuyonnghuu,tiitlee frrom Tgoongwwen wheere farriqii220044-5-5 andd nee

12、ibuuyonnghuu=办办公室查询速度:25116毫秒秒(3)seelecct ggid,farriqii,neeibuuyonnghuu,tiitlee frrom Tgoongwwen wheere neiibuyyongghu=办公公室查询速度:602280毫毫秒从以上试验验中,我我们可以以看到如如果仅用用聚集索索引的起起始列作作为查询询条件和和同时用用到复合合聚集索索引的全全部列的的查询速速度是几几乎一样样的,甚甚至比用用上全部部的复合合索引列列还要略略快(在在查询结结果集数数目一样样的情况况下);而如果果仅用复复合聚集集索引的的非起始始列作为为查询条条件的话话,这个个索引是是不起

13、任任何作用用的。当当然,语语句1、22的查询询速度一一样是因因为查询询的条目目数一样样,如果果复合索索引的所所有列都都用上,而而且查询询结果少少的话,这这样就会会形成“索引覆覆盖”,因而而性能可可以达到到最优。同同时,请请记住:无论您您是否经经常使用用聚合索索引的其其他列,但但其前导导列一定定要是使使用最频频繁的列列。(四)其他他书上没没有的索索引使用用经验总总结1、用聚合合索引比比用不是是聚合索索引的主主键速度度快下面是实例例语句:(都是是提取225万条条数据)selecct ggid,farriqii,neeibuuyonnghuu,reeadeer,ttitlle ffromm Tggo

14、nggwenn whheree faariqqi=20004-99-166使用时间:33226毫秒秒selecct ggid,farriqii,neeibuuyonnghuu,reeadeer,ttitlle ffromm Tggonggwenn whheree giid20004-11-1用时:63343毫毫秒(提提取1000万条条) selecct ggid,farriqii,neeibuuyonnghuu,reeadeer,ttitlle ffromm Tggonggwenn whheree faariqqi20004-66-6用时:31170毫毫秒(提提取500万条)selecct g

15、gid,farriqii,neeibuuyonnghuu,reeadeer,ttitlle ffromm Tggonggwenn whheree faariqqi=20004-99-166用时:33326毫毫秒(和和上句的的结果一一模一样样。如果果采集的的数量一一样,那那么用大大于号和和等于号号是一样样的)selecct ggid,farriqii,neeibuuyonnghuu,reeadeer,ttitlle ffromm Tggonggwenn whheree faariqqi20004-11-1 annd ffariiqi20004-11-1 orrderr byy faariqqi用

16、时:63390毫毫秒selecct ggid,farriqii,neeibuuyonnghuu,reeadeer,ttitlle ffromm Tggonggwenn whheree faariqqi 100000和执行:selecct * frrom tabble11 whheree tIID 1000000 annd nnamee=zzhanngsaan一些人不知知道以上上两条语语句的执执行效率率是否一一样,因因为如果果简单的的从语句句先后上上看,这这两个语语句的确确是不一一样,如如果tIID是一一个聚合合索引,那那么后一一句仅仅仅从表的的100000条条以后的的记录中中查找就就行了;而前

17、一一句则要要先从全全表中查查找看有有几个nnamee=zzhanngsaan的的,而后后再根据据限制条条件条件件tIDD1000000来提出出查询结结果。事实上,这这样的担担心是不不必要的的。SQQL SSERVVER中中有一个个“查询分分析优化化器”,它可可以计算算出whheree子句中中的搜索索条件并并确定哪哪个索引引能缩小小表扫描描的搜索索空间,也也就是说说,它能能实现自自动优化化。虽然查询优优化器可可以根据据wheere子子句自动动的进行行查询优优化,但但大家仍仍然有必必要了解解一下“查询优优化器”的工作作原理,如如非这样样,有时时查询优优化器就就会不按按照您的的本意进进行快速速查询。

18、在查询分析析阶段,查查询优化化器查看看查询的的每个阶阶段并决决定限制制需要扫扫描的数数据量是是否有用用。如果果一个阶阶段可以以被用作作一个扫扫描参数数(SAARG),那那么就称称之为可可优化的的,并且且可以利利用索引引快速获获得所需需数据。SARG的的定义:用于限限制搜索索的一个个操作,因因为它通通常是指指一个特特定的匹匹配,一一个值得得范围内内的匹配配或者两两个以上上条件的的ANDD连接。形形式如下下:列名 操作作符 或 操操作符列列名列名可以出出现在操操作符的的一边,而而常数或或变量出出现在操操作符的的另一边边。如:Name=张三价格500005000550000如果一个表表达式不不能满足

19、足SARRG的形形式,那那它就无无法限制制搜索的的范围了了,也就就是SQQL SSERVVER必必须对每每一行都都判断它它是否满满足WHHEREE子句中中的所有有条件。所所以一个个索引对对于不满满足SAARG形形式的表表达式来来说是无无用的。介绍完SAARG后后,我们们来总结结一下使使用SAARG以以及在实实践中遇遇到的和和某些资资料上结结论不同同的经验验:1、Likke语句句是否属属于SAARG取取决于所所使用的的通配符符的类型型如:namme llikee 张% ,这这就属于于SARRG而:namme llikee %张 ,就就不属于于SARRG。原因是通配配符%在在字符串串的开通通使得索

20、索引无法法使用。2、or 会引起起全表扫扫描Name=张三 annd 价价格550000 符号号SARRG,而而:Naame=张三 orr 价格格50000 则不符符合SAARG。使使用orr会引起起全表扫扫描。3、非操作作符、函函数引起起的不满满足SAARG形形式的语语句不满足SAARG形形式的语语句最典典型的情情况就是是包括非非操作符符的语句句,如:NOTT、!=、!、NOOT EEXISSTS、NNOT IN、NNOT LIKKE等,另另外还有有函数。下下面就是是几个不不满足SSARGG形式的的例子:ABS(价价格)50000SQL SSERVVER也也会认为为是SAARG,SSQL S

21、ERRVERR会将此此式转化化为:WHEREE 价格格25500/2但我们不推推荐这样样使用,因因为有时时SQLL SEERVEER不能能保证这这种转化化与原始始表达式式是完全全等价的的。4、IN 的作用用相当与与OR语句:Selecct * frrom tabble11 whheree tiid iin (2,33)和Selecct * frrom tabble11 whheree tiid=22 orr tiid=33是一样的,都都会引起起全表扫扫描,如如果tiid上有有索引,其其索引也也会失效效。5、尽量少少用NOOT6、exiistss 和 in 的执行行效率是是一样的的很多资料上上都

22、显示示说,eexissts要要比inn的执行行效率要要高,同同时应尽尽可能的的用noot eexissts来来代替nnot in。但但事实上上,我试试验了一一下,发发现二者者无论是是前面带带不带nnot,二二者之间间的执行行效率都都是一样样的。因因为涉及及子查询询,我们们试验这这次用SSQL SERRVERR自带的的pubbs数据据库。运运行前我我们可以以把SQQL SSERVVER的的staatissticcs II/O状状态打开开。(1)seelecct ttitlle,ppricce ffromm tiitlees wwherre ttitlle_iid iin (sellectt ti

23、itlee_idd frrom salles wheere qtyy300)该句的执行行结果为为:表 saaless。扫扫描计数数 188,逻辑辑读 556 次次,物理理读 00 次,预预读 00 次。表 tiitlees。扫扫描计数数 1,逻逻辑读 2 次次,物理理读 00 次,预预读 00 次。 (2)seelecct ttitlle,ppricce ffromm tiitlees wwherre eexissts (seelecct * frrom salles wheere salles.tittle_id=tittless.tiitlee_idd annd qqty30)第二句的执执

24、行结果果为:表 saaless。扫扫描计数数 188,逻辑辑读 556 次次,物理理读 00 次,预预读 00 次。表 tiitlees。扫扫描计数数 1,逻逻辑读 2 次次,物理理读 00 次,预预读 00 次。我们从此可可以看到到用exxistts和用用in的的执行效效率是一一样的。7、用函数数chaarinndexx()和和前面加加通配符符%的LLIKEE执行效效率一样样前面,我们们谈到,如如果在LLIKEE前面加加上通配配符%,那那么将会会引起全全表扫描描,所以以其执行行效率是是低下的的。但有有的资料料介绍说说,用函函数chhariindeex()来代替替LIKKE速度度会有大大的提升

25、升,经我我试验,发发现这种种说明也也是错误误的:selecct ggid,tittle,farriqii,reeadeer ffromm tggonggwenn whheree chhariindeex(刑侦支支队,reaaderr)00 annd ffariiqi20004-5-55用时:7秒秒,另外外:扫描描计数 4,逻逻辑读 71555 次次,物理理读 00 次,预预读 00 次。selecct ggid,tittle,farriqii,reeadeer ffromm tggonggwenn whheree reeadeer llikee % + 刑刑侦支队队 + % aand farr

26、iqii220044-5-5用时:7秒秒,另外外:扫描描计数 4,逻逻辑读 71555 次次,物理理读 00 次,预预读 00 次。8、uniion并并不绝对对比orr的执行行效率高高我们前面已已经谈到到了在wwherre子句句中使用用or会会引起全全表扫描描,一般般的,我我所见过过的资料料都是推推荐这里里用unnionn来代替替or。事事实证明明,这种种说法对对于大部部分都是是适用的的。selecct ggid,farriqii,neeibuuyonnghuu,reeadeer,ttitlle ffromm Tggonggwenn whheree faariqqi=20004-99-166

27、orr giid9999000000用时:688秒。扫扫描计数数 1,逻逻辑读 40440088 次,物物理读 2833 次,预预读 33921163 次。selecct ggid,farriqii,neeibuuyonnghuu,reeadeer,ttitlle ffromm Tggonggwenn whheree faariqqi=20004-99-166 unionnselecct ggid,farriqii,neeibuuyonnghuu,reeadeer,ttitlle ffromm Tggonggwenn whheree giid9999000000用时:9秒秒。扫描描计数 8,逻

28、逻辑读 674489 次,物物理读 2166 次,预预读 774999 次。看来,用uunioon在通通常情况况下比用用or的的效率要要高的多多。但经过试验验,笔者者发现如如果orr两边的的查询列列是一样样的话,那那么用uunioon则反反倒和用用or的的执行速速度差很很多,虽虽然这里里uniion扫扫描的是是索引,而而or扫扫描的是是全表。selecct ggid,farriqii,neeibuuyonnghuu,reeadeer,ttitlle ffromm Tggonggwenn whheree faariqqi=20004-99-166 oor ffariiqi=20004-2-55用

29、时:64423毫毫秒。扫扫描计数数 2,逻逻辑读 147726 次,物物理读 1 次次,预读读 71176 次。selecct ggid,farriqii,neeibuuyonnghuu,reeadeer,ttitlle ffromm Tggonggwenn whheree faariqqi=20004-99-166 unionnselecct ggid,farriqii,neeibuuyonnghuu,reeadeer,ttitlle ffromm Tggonggwenn whheree faariqqi=20004-22-5用时:1116400毫秒。扫扫描计数数 8,逻逻辑读 148806

30、 次,物物理读 1088 次,预预读 111444 次。9、字段提提取要按按照“需多少少、提多多少”的原则则,避免免“sellectt *”我们来做一一个试验验:selecct ttop 100000 gidd,faariqqi,rreadder,tittle froom ttgonngween oordeer bby ggid dessc用时:46673毫毫秒selecct ttop 100000 gidd,faariqqi,ttitlle ffromm tggonggwenn orrderr byy giid ddescc用时:13376毫毫秒selecct ttop 100000 gid

31、d,faariqqi ffromm tggonggwenn orrderr byy giid ddescc用时:800毫秒由此看来,我我们每少少提取一一个字段段,数据据的提取取速度就就会有相相应的提提升。提提升的速速度还要要看您舍舍弃的字字段的大大小来判判断。10、coountt(*)不比ccounnt(字字段)慢慢某些资料上上说:用用*会统统计所有有列,显显然要比比一个世世界的列列名效率率低。这这种说法法其实是是没有根根据的。我我们来看看:selecct ccounnt(*) ffromm Tggonggwenn用时:15500毫毫秒selecct ccounnt(ggid) frrom T

32、goongwwen 用时:14483毫毫秒selecct ccounnt(ffariiqi) frrom Tgoongwwen用时:31140毫毫秒selecct ccounnt(ttitlle) froom TTgonngween用时:5220500毫秒从以上可以以看出,如如果用ccounnt(*)和用用couunt(主键)的速度度是相当当的,而而couunt(*)却却比其他他任何除除主键以以外的字字段汇总总速度要要快,而而且字段段越长,汇汇总的速速度就越越慢。我我想,如如果用ccounnt(*), SQLL SEERVEER可能能会自动动查找最最小字段段来汇总总的。当当然,如如果您直直接写

33、ccounnt(主主键)将将会来的的更直接接些。11、orrderr byy按聚集集索引列列排序效效率最高高我们来看:(giid是主主键,ffariiqi是是聚合索索引列)selecct ttop 100000 gidd,faariqqi,rreadder,tittle froom ttgonngween用时:1996 毫毫秒。 扫描计计数 11,逻辑辑读 2289 次,物物理读 1 次次,预读读 15527 次。selecct ttop 100000 gidd,faariqqi,rreadder,tittle froom ttgonngween oordeer bby ggid ascc用时

34、:47720毫毫秒。 扫描计计数 11,逻辑辑读 4419556 次次,物理理读 00 次,预预读 112877 次。selecct ttop 100000 gidd,faariqqi,rreadder,tittle froom ttgonngween oordeer bby ggid dessc用时:47736毫毫秒。 扫描计计数 11,逻辑辑读 5553550 次次,物理理读 110 次次,预读读 7775 次次。selecct ttop 100000 gidd,faariqqi,rreadder,tittle froom ttgonngween oordeer bby ffariiqi

35、ascc用时:1773毫秒秒。 扫扫描计数数 1,逻逻辑读 2900 次,物物理读 0 次次,预读读 0 次。selecct ttop 100000 gidd,faariqqi,rreadder,tittle froom ttgonngween oordeer bby ffariiqi dessc用时:1556毫秒秒。 扫扫描计数数 1,逻逻辑读 2899 次,物物理读 0 次次,预读读 0 次。从以上我们们可以看看出,不不排序的的速度以以及逻辑辑读次数数都是和和“ordder by 聚集索索引列” 的速速度是相相当的,但但这些都都比“ordder by 非聚集集索引列列”的查询询速度是是快得

36、多多的。同时,按照照某个字字段进行行排序的的时候,无无论是正正序还是是倒序,速速度是基基本相当当的。12、高效效的TOOP事实上,在在查询和和提取超超大容量量的数据据集时,影影响数据据库响应应时间的的最大因因素不是是数据查查找,而而是物理理的I/0操作作。如:selecct ttop 10 * ffromm (selecct ttop 100000 gidd,faariqqi,ttitlle ffromm tggonggwennwheree neeibuuyonnghuu=办办公室orderr byy giid ddescc) aas aaorderr byy giid aasc这条语句,从从

37、理论上上讲,整整条语句句的执行行时间应应该比子子句的执执行时间间长,但但事实相相反。因因为,子子句执行行后返回回的是1100000条记记录,而而整条语语句仅返返回100条语句句,所以以影响数数据库响响应时间间最大的的因素是是物理II/O操操作。而而限制物物理I/O操作作此处的的最有效效方法之之一就是是使用TTOP关关键词了了。TOOP关键键词是SSQL SERRVERR中经过过系统优优化过的的一个用用来提取取前几条条或前几几个百分分比数据据的词。经经笔者在在实践中中的应用用,发现现TOPP确实很很好用,效效率也很很高。但但这个词词在另外外一个大大型数据据库ORRACLLE中却却没有,这这不能说

38、说不是一一个遗憾憾,虽然然在ORRACLLE中可可以用其其他方法法(如:rowwnummberr)来解解决。在在以后的的关于“实现千千万级数数据的分分页显示示存储过过程”的讨论论中,我我们就将将用到TTOP这这个关键键词。到此为止,我我们上面面讨论了了如何实实现从大大容量的的数据库库中快速速地查询询出您所所需要的的数据方方法。当当然,我我们介绍绍的这些些方法都都是“软”方法,在在实践中中,我们们还要考考虑各种种“硬”因素,如如:网络络性能、服服务器的的性能、操操作系统统的性能能,甚至至网卡、交交换机等等。三、实现小小数据量量和海量量数据的的通用分分页显示示存储过过程建立一个wweb 应用,分分

39、页浏览览功能必必不可少少。这个个问题是是数据库库处理中中十分常常见的问问题。经经典的数数据分页页方法是是:ADDO 纪纪录集分分页法,也也就是利利用ADDO自带带的分页页功能(利利用游标标)来实实现分页页。但这这种分页页方法仅仅适用于于较小数数据量的的情形,因因为游标标本身有有缺点:游标是是存放在在内存中中,很费费内存。游游标一建建立,就就将相关关的记录录锁住,直直到取消消游标。游游标提供供了对特特定集合合中逐行行扫描的的手段,一一般使用用游标来来逐行遍遍历数据据,根据据取出数数据条件件的不同同进行不不同的操操作。而而对于多多表和大大表中定定义的游游标(大大的数据据集合)循循环很容容易使程程序

40、进入入一个漫漫长的等等待甚至至死机。更重要的是是,对于于非常大大的数据据模型而而言,分分页检索索时,如如果按照照传统的的每次都都加载整整个数据据源的方方法是非非常浪费费资源的的。现在在流行的的分页方方法一般般是检索索页面大大小的块块区的数数据,而而非检索索所有的的数据,然然后单步步执行当当前行。 最最早较好好地实现现这种根根据页面面大小和和页码来来提取数数据的方方法大概概就是“俄罗斯斯存储过过程”。这个个存储过过程用了了游标,由由于游标标的局限限性,所所以这个个方法并并没有得得到大家家的普遍遍认可。后来,网上上有人改改造了此此存储过过程,下下面的存存储过程程就是结结合我们们的办公公自动化化实例

41、写写的分页页存储过过程:CREATTE pprocceduure pagginaatioon1(paggesiize intt, -页面大大小,如如每页存存储200条记录录pageeinddex intt -当前前页码)asset nnocoountt onnbeginndeclaare inndexxtabble tabble(id intt iddenttityy(1,1),nidd innt) -定义表表变量declaare PaageLLoweerBooundd innt -定义此此页的底底码declaare PaageUUppeerBooundd innt -定义此此页的顶顶码set

42、 PaggeLoowerrBouund=(ppageeinddex-1)*paagessizeeset PaggeUppperrBouund=PaageLLoweerBooundd+ppageesizzeset rrowccounnt PaggeUppperrBouundinserrt iintoo iindeextaablee(niid) sellectt giid ffromm TGGonggwenn whheree faariqqi datteaddd(dday,-3665,ggetddatee() orrderr byy faariqqi ddesccselecct OO.giid,O

43、O.miid,OO.tiitlee,O.faddanwwei,O.ffariiqi froom TTGonngween OO,iindeextaablee t wheere O.ggid=t.nnidand tt.iddPPageeLowwerBBounnd aand t.iid=PaageUUppeerBooundd orrderr byy t.idendset nnocoountt offf以上存储过过程运用用了SQQL SSERVVER的的最新技技术表变量量。应该该说这个个存储过过程也是是一个非非常优秀秀的分页页存储过过程。当当然,在在这个过过程中,您您也可以以把其中中的表变变量写成成临时表表:CRREATTE TTABLLE #Temmp。但但很明显显,在SSQL SERRVERR中,用用临时表表是没有有用表变变量快的的。所以以笔者刚刚开始使使用这个个存储过过程时,感感觉非常常

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!