类型:转载 责任编辑:asp 日期:2007/03/01
---- 例:表card有7896行,在card_no上有一个非聚集索引,表account有191122行,在 account_no上有一个非聚集索引,试看在不同的表连接条件下,两个sql的执行情况:
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
---- 在第二个连接条件下,最佳查询方案是将card作外层表,account作内层表,利用account上的索引,其i/o次数可由以下公式估算为:
---- 外层表card上的1944页+(外层表card的7896行*内层表account上对应外层表每一行所要查找的4页
以上的例子中说第2条sql是少于1秒,而第一条要花上20秒,
我想问高手几个问题:
1。就什么叫外层表,内层表?
2。什么是聚集索引,非聚集索引?
3。能不能详细解释一下,这个2条sql产生性能差别这么大的原因,我看就只是where条件不一样而已嘛,看不大出什么奥妙,清高手显身给个准确的说法,谢谢
推荐阅读
1.外层、内层就象嵌套循环的外层循环和内层循环一样。
2.聚集索引是在聚集上建立的,一般的索引都是非聚集索引,查查书就可以了解了。
3.其实分析已经写得很清楚了card表的记录远远小于account表,再多加了个条件,速度当然大大提高。你只要理解了1,这些就清楚了。
聚集索引是对建立索引的字段在物理上的排列是有序的,这种索引对于一定范围内的查询很有效,因为它只需要找到第一条,然后依次向下取数据就可以了,直到条件不满足。
.