long sort 和 short sort

long sort 和 short sort
转自 http://www.itpub.net/thread-1266906-1-1.html
对这个帖子 http://www.itpub.net/thread-1266765-1-1.html
的SQL做了点测试,顺便发现oracle 10g对排序这个操作还是很有点门道值得我们研究的。

比如对于如下的两个SQL:

SQL1:
SELECT * FROM
(
SELECT a.*,ROWNUM AS rn FROM
(SELECT * FROM t ORDER BY t.c1 ) a
)
WHERE rn <=100 and rn >= 90;

SQL2:
SELECT * FROM
(
SELECT a.*,ROWNUM AS rn FROM
(SELECT * FROM t WHERE ORDER BY t.c1 )a
WHERE ROWNUM<=100
)
WHERE rn>90;


这是典型的分页查询,SQL2是典型的公认的比SQL1性能更好,可以体现在对排序的不同处理方面。

按照oracle 10132 trace里看到,
对SQL1 oracle是采用sort version 2(我们可以说它是long sort),也是我们一般所认为的排序方式。
对SQL2,oracle采用的是sort version 1 (我们可以说它是short sort),是一种特殊的排序。

其实SQL2的优势就在于,它可以让oracle在排序的时候知道我们最终只对前一百行数据感兴趣,从而可以对排序做一些优化。
而SQL1做不到这一点。

普通的排序,比如(select * from t1 order by c1)这样的语句,一定是把所有的数据都放到内存里进行排序,这对内存要求比较高。

short sort的时候,比如针对SQL2的排序,
oracle只需要在PGA里维护一个包含100个数值的树状结构,
当有新数据进来的时候,新数据将会和原来的100个数据中的最大值作比较(如果是降序排序则会和最小值比较),
如果新数据更大,就直接舍弃新数据,
如果新数据更小,就舍弃原来的100个数据中的最大值,并把新数据插入到内存的树状结构中。


这样就起到了节省内存的作用。当然进一步会节省临时空间。
但是CPU方面很难说哪种方式更优秀,因为我在trace里看到有些metrics普通排序(或者long sort)还是比较好的。

比如Total number of comparisons performed    这个值普通排序更低,我想compare越少当然越节省CPU.

但是Direct Read Statistics的数据 short sort明显优越得多。

大家要看测试例子直接来这个帖子吧,太晚了,最近也好忙,没时间做更系统的测试,以后找时间再测测:
http://www.itpub.net/viewthread. ... p;extra=&page=2

画了张图,用window的画图画的,土了点,大家将就看看吧

[ 本帖最后由 fusnow 于 2010-2-4 11:51 编辑 ]




fusnow 上传了这个附件:
2010-2-3 00:53
long sort and short sort.JPG (88.02 KB)
 
点击在新窗口查看全图 CTRL+鼠标滚轮放大或缩小

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7728585/viewspace-667868/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/7728585/viewspace-667868/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值