例:表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页 中 【页】的概念是什么?
网管网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页 中 【页】的概念是什么?
页是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,就再移回来.
将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秒)后面这个多个条件,合计的记录少了,所以速度快.
我还想大家问一下,
外层表account上的22541页+(外层表account的191122行*内层表card上对应外层表第一行所要查找的3页)=595907次I/O
---------------------中------------------------------
外层表account上的22541页 -》是 实际访问数据库的IO数量吗?
还有 外层表account的191122行*内层表card上对应外层表第一行所要查找的3页
-》是 cpu中 的表连接io次数吗?
这个很重要,请高数我
谢谢大家。。
http://blog.csdn.net/feixianxxx/archive/2010/01/24/5249919.aspx