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对排序这个操作还是很有点门道值得我们研究的。
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 = 90;

SQL2:
SELECT * FROM
(
SELECT a.*,ROWNUM AS rn FROM
(SELECT * FROM t WHERE ORDER BY t.c1 )a
WHERE ROWNUM)
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+鼠标滚轮放大或缩小
相关文章
|
机器学习/深度学习 自然语言处理 TensorFlow
Long Short-Term Memory,简称 LSTM
长短期记忆(Long Short-Term Memory,简称 LSTM)是一种特殊的循环神经网络(RNN)结构,用于处理序列数据,如语音识别、自然语言处理、视频分析等任务。LSTM 网络的主要目的是解决传统 RNN 在训练过程中遇到的梯度消失和梯度爆炸问题,从而更好地捕捉序列数据中的长期依赖关系。
131 4
|
机器学习/深度学习 自然语言处理 数据挖掘
【文本分类】Attention-Based Bidirectional Long Short-Term Memory Networks for Relation Classification
【文本分类】Attention-Based Bidirectional Long Short-Term Memory Networks for Relation Classification
163 0
【文本分类】Attention-Based Bidirectional Long Short-Term Memory Networks for Relation Classification
JDK源码(11)-Long、Short
JDK源码(11)-Long、Short
114 0
JDK源码(11)-Long、Short
java中整型数据(byte、short、int、long)溢出的现象及原理
java中整型数据(byte、short、int、long)溢出的现象及原理
|
机器学习/深度学习
3_Long Short Term Memory (LSTM)
3_Long Short Term Memory (LSTM)
135 0
3_Long Short Term Memory (LSTM)
|
机器学习/深度学习 算法框架/工具
(zhuan) Attention in Long Short-Term Memory Recurrent Neural Networks
Attention in Long Short-Term Memory Recurrent Neural Networks by Jason Brownlee on June 30, 2017 in Deep Learning   The Encoder-Decoder architecture i...
|
Linux C语言 存储
printf中的short int, int, long int和long long int
hd: short int d: int ld: long int lld: long long int Linux基本数据类型大小——int,char,long int,long long int 在Linux操作系统下使用GCC进行编程,目前一般处理器为32位字宽,下面是/usr/include/limit.h文件对Linux下数据类型的限制及存储字节大小的说明。
1178 0
|
7月前
|
JSON JavaScript 前端开发
解决js中Long类型数据在请求与响应过程精度丢失问题(springboot项目中)
解决js中Long类型数据在请求与响应过程精度丢失问题(springboot项目中)
634 0
|
7月前
|
编译器 C语言
c语言中long的作用类型
c语言中long的作用类型
198 0