ǰλã >> SQL >> SQL?引的原理һ
  ϸ

SQL?引的原理һ

ȶȣ17328   ʱ䣺2016-05-05 10:48:19.0
SQL?引的原理1
(一)深入浅出理解索引结?nbsp; 
   
  实际上,您可以把索引理解为一种特殊的?。微?SQL   SERVER提供了两种索引:聚集索引(clustered   index,也称聚类索引?簇集索引)和非聚集索引(nonclustered   index,也称非聚类索引、非簇集索引)?下?我们举例来?明一下聚集索引和非聚集索引的区别?nbsp; 
   
  其实,我?汉?字典的?文本???集索引?比如,我们要查“安”字,就会很?地翻?字典的前几页,因为?安”的拼音??an”,而按照拼音排序汉字的字典?英文字母“a”开头并以?z”结尾的,那么?安”字就自然地排在字典的前部??果您翻完了所有以“a”开头的部分仍然找不到这?,那么就说明您的字典?有这?;同样的,?果查“张”字,那您也会将您的字典翻到?后部分,因为“张”的拼音??zhang”?也就是说,字典的?文部分本???录,您不?要再去查其他?来找到您?要找的内容??nbsp; 
   
  我们把这种?文内容本??种按照一定?则排列的?称为“聚集索引???nbsp; 
   
  如果您?识某?,您???地从自动中查到这个字?但您也?会遇到您不?识的字,不知道它的发音,这时候,您就不能按照刚才的方法找到您要查的字,?需要去根据“偏旁部首?查到您要找的字,然后根??后的页码直接翻到某页来找到您要找的字。但您结合?部首目录?和“?字表”?查到的字的排序并不?正的正文的排序方法,比?您查“张”字,我?以看到在查部首之后的?字表??张”的页码?72页,?字表??张”的上面??驰”字,但页码却是63页,“张”的下面??弩”字,页面是390页?很显然,这些字并不?正的分别位于“张”字的上下方,现在您看到的连?“驰、张、弩”三字实际上就是他们在非聚集索引?排序,是字典正文?字在非聚集索引中的映射?我?以?过这?方式来找到您??要的字,但它?要两?程,先找到目录中的结果,然后再翻到您??要的页码?nbsp; 
   
  我们把这种目录纯粹是?,?文纯粹是正文的排序方式称为?非聚集索引”??nbsp; 
   
  通过以上例子,我?以理解到?么是“聚集索引?和“非聚集索引”??nbsp; 
   
  进一步引申一下,我们?很?易的理解:每??有一?集索引,因为??按照?种方法进行排序??nbsp; 
   
  (二)何时使用聚集索引或非聚集索?nbsp; 
   
  下面的表总结了何时使用聚集索引或非聚集索引(很重要)?nbsp; 




  事实上,我们?通过前面聚集索引和非聚集索引的定义的例子来理解上表??:返回某范围内的数据?项?比如您的某?有一?间列,恰好您把聚合索引建立在了?列,这时您查?004??日至2004?0?日之间的全部数据时,这个速度就将??,因为您的这?典?文是按日期进行排序的,聚类索引只?要找到??索的?有数?的开头和结尾数据即可;?不像非聚集索引,必须先查到??到每?项数??应的页码,然后再根据页码查到具体内??nbsp; 
   
  (三)结合实际,谈索引使用的?  
   
  理?的目的是应用。虽然我?才列出了何时应使用聚集索引或非聚集索引,但在实践?上?则却很?易?忽?或不能根?际情况进行综合分析?下面我?根据在实践中遇到的实际问题来谈一下索引使用的?,以便于大?掌握索引建立的方法??nbsp; 
   
  1、主??集索?nbsp; 
   
  这?想法笔??为是极?错?的,??聚集索引的一种浪费?虽然SQL   SERVER默??主键上建立聚集索引的?nbsp; 
   
  通常,我?在每??建立?个ID列,以区分每条数?并且这个ID列是?增大的,步长??1。我?这个办公?化的实例?列Gid就是如?。?时,如果我们将这?设为主键,SQL   SERVER会将此列默?为聚集索引?这样做有好处,就是?让您的数?数据库中按照ID进?物理排序,但笔??为这样做意义不大?nbsp; 
   
  显?易见,聚集索引的优势是很明显的,?每??能有??集索引的规则,这使得聚集索引变得更加珍贵?nbsp; 
   
  从我?面谈到的聚集索引的定义我?以看出,使用聚集索引的最大好处就?够根?询?求,迅?缩小查询范围,避免全表?。在实际应用?因为ID号是?生成的,我们并不知道每条记录的ID号,?以我?难在实践?ID号来进?查?。这就使让ID号这??为聚集索引成为一种资源浪费?其次,让每个ID号都不同的字段作为聚集索引也不?合?大数目的不同?情况下不应建立聚合索引”?则;当然,这种情况只?对用户经常修改?录内容,特别?引项的时候会负作?但?于查询?度并没有影响??nbsp; 
   
  在办?动化系统?无??统?页显示的?要用户?收的文件、会??户进行文件查询等任何情况下进行数?询都离不?字?的是“日期?还有用户本?“用户名”??nbsp; 
   
  通常,办?动化的?页会显示每个用户尚未签收的文件或会?。虽然我?where??仅仅限制当前用户尚未签收的情况,但?果您的系统已建立了很长时间,并且数据量很大,那么,每次每?户打?首页的时候都进??次全表扫描,这样做意义是不大的,绝大多数的用??前的文件都已经浏览过了,这样做只能徒增数?的开?而已。事实上,我?全可以?用户打开系统首页时,数据库仅仅查询这?户近3?来未阅?的文件,通过“日期?这?段来限制表扫描,提高查?速度。?果您的办?动化系统已经建立?年,那么您的首页显示速度理?上将?来?度8倍,甚至更快?
在这里之?以提到?理论上”三字,?为?果您的聚集索引还??建在ID这个主键上时,您的查询?度?有这么高的,即使您在“日期?这?段上建立的索引(非聚合索引)。下面我?来看?下在1000万条数据量的情况下各种查询的速度表现??内的数据?5万条):  
   
  ?)仅在主?建立聚集索引,并且不划分时间段:  
   
  Select   gid,fariqi,neibuyonghu,title   from   tgongwen  
   
  用时?28470??(即?28秒)  
   
  ?)在主键上建立聚集索引,在fariq上建立非聚集索引?nbsp; 
   
  select   gid,fariqi,neibuyonghu,title   from   Tgongwen  
   
  where   fariqi>   dateadd(day,-90,getdate())  
   
  用时?3763???4秒)  
   
  ?)将聚合索引建立在日期列(fariqi)上?nbsp; 
   
  select   gid,fariqi,neibuyonghu,title   from   Tgongwen  
   
  where   fariqi>   dateadd(day,-90,getdate())  
   
  用时?423???秒)  
   
  虽然每条?提取出来的都?5万条数据,各种情况的?却是巨大的,特别?聚集索引建立在日期列时的?。事实上,?果您的数?真的?000万?量的话,把主?立在ID列上,就像以上的??种情况,在网页上的表现就?时,根本就无法显示?这也是我摒弃ID列作为聚集索引的??重?的因素??nbsp; 
   
  得出以上速度的方法是:在各个select?前加:declare   @d   datetime  
   
  set   @d=getdate()  
   
  并在select?后加?nbsp; 
   
  select   [?执?花费时间(??)]=datediff(ms,@d,getdate())  
   
  2、只要建立索引就能显著提高查询?度  
   
  事实上,我们?发现上面的例子中,?2?条?句完全相同,且建立索引的字?也相同;不同的仅?者在fariqi字?上建立的?聚合索引,后者在此字段上建立的是聚合索引,但查?速度却有?天壤之别。所以,并非?任何字?上简单地建立索引就能提高查?速度?nbsp; 
   
  从建表的??我们?看到这个有着1000万数?表中fariqi字??003?同?录?在此字段上建立聚合索引?合?不过了。在现实?我们每天都会发几?件,这几?件的发文日期就相同,这完全?合建立聚集索引?求的:?既不能绝大多数都相同,又不能只有极少数相同”的规则。由此看来,我们建立“?当”的聚合索引对于我们提高查?速度?常重要的?nbsp; 
   
  3、把?有需要提高查询?度的字段都加进聚集索引,以提高查?速度  
   
  上面已经谈到:在进?数据查?时都离不?字?的是“日期?还有用户本?“用户名”?既然这两个字?都是如?的重要,我们?把他?并起来,建立???合索引(compound   index)??nbsp; 
   
  很?人?为只要把任何字?加进聚集索引,就能提高查询?度,也有人感到迷惑:?果把复合的聚集索引字段分?查?,那么查询?度会减慢吗?带?这个??,我?看一下以下的查?速度(结果集都是25万条数据):(日期列fariqi首先排在复合聚集索引的起始列,用户名neibuyonghu排在后列?nbsp; 
   
  ?)select   gid,fariqi,neibuyonghu,title   from   Tgongwen   where   fariqi>'2004-5-5'    
   
  查?速度?513??  
   
  ?)select   gid,fariqi,neibuyonghu,title   from   Tgongwen   where   fariqi>'2004-5-5'   and   neibuyonghu='办公?  
   
  查?速度?516??  
   
  ?)select   gid,fariqi,neibuyonghu,title   from   Tgongwen   where   neibuyonghu='办公?  
   
  查?速度?0280??  
   
  从以上试验中,我?以看到?果仅用聚集索引的起?列作为查询条件和同时用到复合聚集索引的全部列的查询?度?乎一样的,甚至比用上全部的?合索引列还?略快(在查?结果集数?样的情况下);??果仅用?合聚集索引的非起始列作为查?条件的话,这?引是不起任何作用的?当然,?1?的查询?度?样是因为查?的条??样,如果复合索引的所有列都用上,而且查?结果少的话,这样就会形成“索引?盖?,因??能?达到?优?同时,请?住:无?您是否经常使用聚合索引的其他列,但其前?列一定??用最频繁的列?nbsp; 
   
  (四)其他书上没有的索引使用经验总结  
   
  1、用聚合索引比用不是聚合索引的主??度?nbsp; 
   
  下面?例?句:(都??5万条数据?nbsp; 
   
  select   gid,fariqi,neibuyonghu,reader,title   from   Tgongwen   where   fariqi='2004-9-16'  
   
  使用时间?326??  
   
  select   gid,fariqi,neibuyonghu,reader,title   from   Tgongwen   where   gid<=250000  
   
  使用时间?470??  
   
  这里,用聚合索引比用不是聚合索引的主??度??/4?nbsp; 
   
  2、用聚合索引比用??主键作order   by时?度?特别?小数?情况?nbsp; 
   
  select   gid,fariqi,neibuyonghu,reader,title   from   Tgongwen   order   by   fariqi  
   
  用时?2936  
   
  select   gid,fariqi,neibuyonghu,reader,title   from   Tgongwen   order   by   gid  
   
  用时?8843  
   
  这里,用聚合索引比用??主键作order   by时,速度?3/10。事实上,?果数?很小的话,用聚集索引作为排序列?比使用非聚集索引速度?明显的?;?数?如果很大的话,?10万以上,则二者的速度?不明显??nbsp; 
   
  3、使用聚合索引内的时间?,搜索时间会按数?整个数据表的百分比成比例减少,?无论聚合索引使用了多少?nbsp; 
   
  select   gid,fariqi,neibuyonghu,reader,title   from   Tgongwen   where   fariqi>'2004-1-1'  
   
  用时?343??(提?00万条?nbsp;   
   
  select   gid,fariqi,neibuyonghu,reader,title   from   Tgongwen   where   fariqi>'2004-6-6'  
   
  用时?170??(提?0万条?nbsp; 
   
  select   gid,fariqi,neibuyonghu,reader,title   from   Tgongwen   where   fariqi='2004-9-16'  
   
  用时?326??(和上句的结果一模一样??果采集的数量?样,那么用大于号和等于号?样的?nbsp; 
   
  select   gid,fariqi,neibuyonghu,reader,title   from   Tgongwen   where   fariqi>'2004-1-1'   and   fariqi<'2004-6-6'  
   
  用时?280??  
   
  4   、日期列不会因为有分秒的输入而减慢查询?度  
   
  下面的例子中,共?00万条数据?004??日以后的数据?0万条,但?两个不同的日期,日期精确到日;之前有数据50万条,有5000?同的日期,日期精?秒??nbsp; 
   
  select   gid,fariqi,neibuyonghu,reader,title   from   Tgongwen   where   fariqi>'2004-1-1'   order   by   fariqi  
   
  用时?390??  
   
  select   gid,fariqi,neibuyonghu,reader,title   from   Tgongwen   where   fariqi<'2004-1-1'   order   by   fariqi  
   
  用时?453??  
   
  (五)其他注意事?nbsp; 
   
  “水?舟,亦可覆舟”,索引也一样?索引有助于提高?索?能,但过?或不当的索引也会导致系统低效。因为用户在表中每加进一?引,数据库就要做更?的工作?过多的索引甚至会?致索引?片??nbsp; 
   
  ?以?,我??建立????当”的索引体系,特?对聚合索引的创建,更应精益求精,以使您的数据库能得到高?能的发挥??nbsp; 
   
  当然,在实践?作为??职的数据库?理员,您还?多测试一些方案,找出??方?效率?高?最为有效??nbsp; 
   
   
   
  二?改善SQL?  
   
  很?人不知道SQL?在SQL   SERVER?如何执?的,他们担心??写的SQL?会?SQL   SERVER?。比如:  
   
  select   *   from   table1   where   name='zhangsan'   and   tID   >   10000  
   
  和执?  
   
  select   *   from   table1   where   tID   >   10000   and   name='zhangsan'  
   
  ?些人不知道以上两条?句的执?效率??样,因为如果?单的从?句先后上看,这两??句的?不一样,如果tID??合索引,那么后一句仅仅从表的10000条以后的记录?找就行了;?前?句则要先从全表中查找看有几个name='zhangsan'的,而后再根?制条件条件tID>10000来提出查询结果??nbsp; 
   
  事实上,这样的担心是不必要的。SQL   SERVER????查询分析优化器”,它可以?算出where子句?搜索条件并确定哪?引能缩小表扫描的搜索空间,也就是说,它能实现?优化?nbsp; 
   
  虽然查?优化器可以根据where子句?的进行查?化,但大家仍然有必?了解?下?查?化器”的工作原理,?非这样,有时查?优化器就会不按照您的?进???查???nbsp; 
   
  在查询分析阶段,查?优化器查看查询的每个阶?并决定限制需要扫描的数据量是否有用??果一?段可以?用作??描参数(SARG),那么就称之为?化的,并且可以利用索引快速获得所?数据?nbsp; 
   
  SARG的定义:用于限制搜索的一?作,因为它?常???定的匹配,一??得范围内的匹配或?两?上条件的AND连接。形式?下:  
   
  列名   操作?nbsp;  <常数   ?nbsp;  变量>  
   
  ?nbsp; 
   
  <常数   ?nbsp;  变量>   操作符列?nbsp; 
   
  列名?出现在操作?的一边,而常数或变量出现在操作?的另?边???nbsp; 
   
  Name=’张三??nbsp; 
   
  价格>5000  
   
  5000<价格  
   
  Name=’张三??nbsp;  and   价格>5000  
   
  如果??达式不能满足SARG的形式,那它就无法限制搜索的范围了,也就是SQL   SERVER必须对每?行都判断它是否满足WHERE子句??有条件?所以一?引?于不满足SARG形式的表达式来??用的?nbsp; 
   
  介绍完SARG后,我们来?结?下使用SARG以及在实践中遇到的和某些资料上结论不同的经验?nbsp; 
   
  1、Like??属于SARG取决于所使用的?配符的类型  
   
  如:name   like   ‘张%?nbsp;  ,这就属于SARG  
   
  而:name   like   ?张??nbsp;  ,就不属于SARG?nbsp; 
   
  原因??配?在字符串的开通使得索引无法使用??nbsp; 
   
  2、or   会引起全表扫?nbsp; 
   
  Name=’张三??nbsp;  and   价格>5000   符号SARG,?:Name=’张三??nbsp;  or   价格>5000   则不符合SARG。使用or会引起全表扫描??nbsp; 
、非操作符?函数引起的不满足SARG形式的??nbsp; 
   
  不满足SARG形式的?句最典型的情况就??操作符的?,?:NOT?=?lt;>?<?>、NOT   EXISTS、NOT   IN、NOT   LIKE等,另?还有函数。下面就??满足SARG形式的例子:  
   
  ABS(价格)<5000  
   
  Name   like   ?三??nbsp; 
   
  有些表达式,如:  
   
  WHERE   价格*2>5000  
   
  SQL   SERVER也会认为是SARG,SQL   SERVER会将此式?为:  
   
  WHERE   价格>2500/2  
   
  但我?推荐这样使用,因为有时SQL   SERVER不能保证这??与原始表达式?全等价的?nbsp; 
   
  4、IN   的作用相当与OR  
   
  ??nbsp; 
   
  Select   *   from   table1   where   tid   in   (2,3)  
   
  ?nbsp; 
   
  Select   *   from   table1   where   tid=2   or   tid=3  
   
  ?样的,都会引起全表扫描,如果tid上有索引,其索引也会失效?nbsp; 
   
  5、尽量少用NOT  
   
  6、exists   ?nbsp;  in   的执行效率是?样的  
   
  很?资料上都显示说,exists要比in的执行效率?高,同时应尽?的用not   exists来代替not   in。但事实上,我试验了?下,发现二?无论是前面带不?ot,二者之间的执?效率都是?样的。因为涉及子查?,我?验这次用SQL   SERVER?的pubs数据库?运行前我们?把SQL   SERVER的statistics   I/O状?打??nbsp; 
   
  ?)select   title,price   from   titles   where   title_id   in   (select   title_id   from   sales   where   qty>30)  
   
  该句的执行结果为?nbsp; 
   
  ?nbsp;  'sales'。扫描??nbsp;  18,?辑?nbsp;  56   次,物理?nbsp;  0   次,预?   0   次??nbsp; 
   
  ?nbsp;  'titles'。扫描??nbsp;  1,?辑?nbsp;  2   次,物理?nbsp;  0   次,预?   0   次??nbsp; 
   
           
   
  ?)select   title,price   from   titles   where   exists   (select   *   from   sales   where   sales.title_id=titles.title_id   and   qty>30)  
   
  ?句的执?结果为:  
   
  ?nbsp;  'sales'。扫描??nbsp;  18,?辑?nbsp;  56   次,物理?nbsp;  0   次,预?   0   次??nbsp; 
   
  ?nbsp;  'titles'。扫描??nbsp;  1,?辑?nbsp;  2   次,物理?nbsp;  0   次,预?   0   次??nbsp; 
   
  我们从??看到用exists和用in的执行效率是?样的?nbsp; 
   
  7、用函数charindex()和前面加通配?的LIKE执?效率??nbsp; 
   
  前面,我?到,如果在LIKE前面加上通配?,那么将会引起全表扫描,?以其执?效率?下的。但有的资料介绍说,用函数charindex()来代替LIKE速度会有大的提升,经我试验,发现这?说明也是错?的:  
   
  select   gid,title,fariqi,reader   from   tgongwen   where   charindex('刑侦?',reader)>0   and   fariqi>'2004-5-5'  
   
  用时?秒,另?:扫描??nbsp;  4,?辑?nbsp;  7155   次,物理?nbsp;  0   次,预?   0   次??nbsp; 
   
  select   gid,title,fariqi,reader   from   tgongwen   where   reader   like   '%'   +   '刑侦?'   +   '%'   and   fariqi>'2004-5-5'  
   
  用时?秒,另?:扫描??nbsp;  4,?辑?nbsp;  7155   次,物理?nbsp;  0   次,预?   0   次??nbsp; 
   
  8、union并不绝?比or的执行效率高  
   
  我们前面已经谈到了在where子句?用or会引起全表扫描,??,我?见过的资料都?荐这里用union来代替or。事实证明,这?说法对于大部分都??用的??nbsp; 
   
  select   gid,fariqi,neibuyonghu,reader,title   from   Tgongwen   where   fariqi='2004-9-16'   or   gid>9990000  
   
  用时?8秒?扫描??nbsp;  1,?辑?nbsp;  404008   次,物理?nbsp;  283   次,预?   392163   次??nbsp; 
   
  select   gid,fariqi,neibuyonghu,reader,title   from   Tgongwen   where   fariqi='2004-9-16'    
   
  union  
   
  select   gid,fariqi,neibuyonghu,reader,title   from   Tgongwen   where   gid>9990000  
   
  用时?秒?扫描??nbsp;  8,?辑?nbsp;  67489   次,物理?nbsp;  216   次,预?   7499   次??nbsp; 
   
  看来,用union在?常情况下比用or的效率?高的多??nbsp; 
   
  但经过试验,笔?发现?果or两边的查询列?样的话,那么用union则反倒和用or的执行?度?多,虽然这里union?的是索引,?or?的是全表?nbsp; 
   
  select   gid,fariqi,neibuyonghu,reader,title   from   Tgongwen   where   fariqi='2004-9-16'   or   fariqi='2004-2-5' 
   
  用时?423??。扫描??nbsp;  2,?辑?nbsp;  14726   次,物理?nbsp;  1   次,预?   7176   次??nbsp; 
   
  select   gid,fariqi,neibuyonghu,reader,title   from   Tgongwen   where   fariqi='2004-9-16'    
   
  union  
   
  select   gid,fariqi,neibuyonghu,reader,title   from   Tgongwen   where     fariqi='2004-2-5'  
   
  用时?1640??。扫描??nbsp;  8,?辑?nbsp;  14806   次,物理?nbsp;  108   次,预?   1144   次??nbsp; 
   
  9、字段提取?按照“需多少、提多少”的原则,避免?select   *?nbsp; 
   
  我们来做??验:  
   
  select   top   10000   gid,fariqi,reader,title   from   tgongwen   order   by   gid   desc  
   
  用时?673??  
   
  select   top   10000   gid,fariqi,title   from   tgongwen   order   by   gid   desc  
   
  用时?376??  
   
  select   top   10000   gid,fariqi   from   tgongwen   order   by   gid   desc  
   
  用时?0??  
   
  由?看来,我?少提取一?段,数据的提取?度就会有相应的提升。提升的速度还?看您舍弃的字段的大小来判???nbsp; 
   
  10、count(*)不比count(字?)?nbsp; 
   
  某些资料上?:用*会统计所有列,显然?比一?界的列名效率低?这种?法其实是没有根据的?我?看:  
   
  select   count(*)   from   Tgongwen  
   
  用时?500??  
   
  select   count(gid)   from   Tgongwen    
   
  用时?483??  
   
  select   count(fariqi)   from   Tgongwen  
   
  用时?140??  
   
  select   count(title)   from   Tgongwen  
   
  用时?2050??  
   
  从以上可以看出,如果用count(*)和用count(主键)的?度?当的,?count(*)却比其他任何除主?外的字?汇??度要快,?且字?越长,汇总的速度就越??我想,如果用count(*)?nbsp;  SQL   SERVER?会自动查找最小字段来汇?的。当然,如果您直接写count(主键)将会来的更直接些?nbsp; 
   
  11、order   by按聚集索引列排序效率??nbsp; 
   
  我们来看:(gid??fariqi?合索引列?nbsp; 
   
  select   top   10000   gid,fariqi,reader,title   from   tgongwen  
   
  用时?96   ???nbsp;  ?计数   1,?辑?nbsp;  289   次,物理?nbsp;  1   次,预?   1527   次??nbsp; 
   
  select   top   10000   gid,fariqi,reader,title   from   tgongwen   order   by   gid   asc  
   
  用时?720???nbsp;  ?计数   1,?辑?nbsp;  41956   次,物理?nbsp;  0   次,预?   1287   次??nbsp; 
   
  select   top   10000   gid,fariqi,reader,title   from   tgongwen   order   by   gid   desc  
   
  用时?736???nbsp;  ?计数   1,?辑?nbsp;  55350   次,物理?nbsp;  10   次,预?   775   次??nbsp; 
   
  select   top   10000   gid,fariqi,reader,title   from   tgongwen   order   by   fariqi   asc  
   
  用时?73???nbsp;  ?计数   1,?辑?nbsp;  290   次,物理?nbsp;  0   次,预?   0   次??nbsp; 
   
  select   top   10000   gid,fariqi,reader,title   from   tgongwen   order   by   fariqi   desc  
   
  用时?56???nbsp;  ?计数   1,?辑?nbsp;  289   次,物理?nbsp;  0   次,预?   0   次??nbsp; 
   
  从以上我?以看出,不排序的速度以及逻辑读?数都?“order   by   聚集索引列??nbsp;  的?度?当的,但这些都比“order   by   非聚集索引列”的查?速度?得?的??nbsp; 
   
  同时,按照某?段进行排序的时?,无???序还??序,?度??当的?nbsp; 
   
  12、高效的TOP  
   
  事实上,在查询和提取超大容量的数?时,影响数据库响应时间的?大因素不??找,而是物理的I/0操作。??nbsp; 
   
  select   top   10   *   from   (  
   
  select   top   10000   gid,fariqi,title   from   tgongwen  
   
  where   neibuyonghu='办公?  
   
  order   by   gid   desc)   as   a  
   
  order   by   gid   asc  
   
  这条?,从理?上?,整条?句的执?时间应?比子句的执?时间长,但事实相反?因为,子句执?后返回的?0000条?录,而整条?句仅返回10条?句,?以影响数?响应时间?大的因素?理I/O操作。?限制物理I/O操作此?的最有效方法之一就是使用TOP关键词了。TOP关键词是SQL   SERVER?过系统优化过的一?来提取前几条或前几个百分比数?词?经笔?在实践?应用,发现TOP?很好?效率也很高?但这个词在另???型数?ORACLE?没有,这不能说不??憾,虽然在ORACLE?以用其他方法(?:rownumber)来解决。在以后的关于?实现千万级数据的分页显示存储过程?的讨??我们就将用到TOP这个关键词??nbsp; 
   
  ؽ