例:表card有7896行,在card_no上有一个非聚集索引,表account有191122行,在 account_no上有一个非聚集索引,试看在不同的表连接条件下,两个SQL的执行情况: 
网管网bitsCN_com  
  select sum(a.amount) from account a,
  card b where a.card_no = b.card_no(20秒)
  将SQL改为:
  select sum(a.amount) from account a,
  card b where a.card_no = b.card_no and a.
  account_no=b.account_no(< 1秒)
  
  分析:
  在第一个连接条件下,最佳查询方案是将account作外层表,card作内层表,利用card上的索引,其I/O次数可由以下公式估算为:
  
  外层表account上的22541页+(外层表account的191122行*内层表card上对应外层表第一行所要查找的3页)=595907次I/O
-------------------------------------------------请问  这里的 22541页   中  【页】的概念是什么?

解决方案 »

  1.   

    链接条件越多,那么SQL自己优化时会采用更高更优的优化策略,所以第二个比第一个快很多。
      

  2.   

    我想大概应该是以下的意思:
    页是SQL Server数据存储的最基本单位,数据文件(.mdf或.ndf)分配的磁盘空间可以从逻辑上划分成页(从0到n连续编号). 磁盘I/O操作在页级执行,区是八个物理上连续的页的集合,用来有效地管理页,所以页都存储在区中。日志文件不包含页,而是一系列日志记录。
    页的大小是8KB,这意味着SQL Server数据库中每MB有128页,16个区。行不能跨页(页的单个行最大数量是8,060字节8kb 1024*8),不包括Text/Image类型的页数据,对于可变长类型的列,如果行超过8060,则从最大长度的列开始,将一个或多个可变长度列移动到ROW_OVERFLOW_DATA分配单元中的页,在原始页上维护一个24字节的指针,如果行的总大小小于8060,就再移回来.
      

  3.   

    select sum(a.amount) from account a, card b where a.card_no = b.card_no(20秒) 
    将SQL改为: 
    select sum(a.amount) from account a, card b where a.card_no = b.card_no and a.ccount_no=b.account_no( < 1秒)后面这个多个条件,合计的记录少了,所以速度快. 
      

  4.   

    谢谢大家给我的答复,尤其是alexwangh。。
    我还想大家问一下,
    外层表account上的22541页+(外层表account的191122行*内层表card上对应外层表第一行所要查找的3页)=595907次I/O 
    ---------------------中------------------------------
    外层表account上的22541页  -》是 实际访问数据库的IO数量吗?
    还有   外层表account的191122行*内层表card上对应外层表第一行所要查找的3页
                                                          -》是 cpu中 的表连接io次数吗?
    这个很重要,请高数我
    谢谢大家。。
      

  5.   

    关于页的知识
    http://blog.csdn.net/feixianxxx/archive/2010/01/24/5249919.aspx