多级CTE快速获得数字表的效率分析

读SQL05技术内幕的时候看到一段迅速取得连续数的代码,如1-1亿

对源代码有改动

测试代码

 在自己的机器上大概2s中就能完成上述过程,之后就想这里用了三级CTE才做到,要是一个CTE做多次交叉连接,就可以减少级数,那么随之带来的效率呢?

测试代码part2

 经过对查询计划的分析和验证,得出以下结论:

在第一段测试代码中,L0中有10行,每个CTE做一次交叉连接,共有三级CTE,那么最后的max(n)=10*exp(2*exp3),在查询中进行了15次交叉连接;
更一般的:
对于L0中有M行数据,每个CTE中有N个表,共k级CTE,那么最后的max(n)=M*exp(N*expk),查询中共进行k*exp(N+1)-1次交叉连接。

所以,要更加快速地得到更大的n,可以把M取大一些(这不是一个好提议,会有大量的重复代码),N取小一些,K视需要来定。
比如同样要得到最大为10*exp64的数字表,有至少如下两种方案:
1 N取4,k取3,交叉连接255次
2 N取2,k取6,交叉连接127次
--也可以令M=100,N=2,k=3,不过代码会大量重复
显然后者更加优秀
posted @ 2008-11-07 00:42  imac'  阅读(1431)  评论(0编辑  收藏  举报