|
排序原理简单说明
排序原理简单说明
针对每个session,排序首先会使用内存排序(具体见数据库相关参数) ,如果不足则会使用临时表空间。但这里面又到底是怎么一个过程呢?下面阐述一下,也许对大家有用处(如果有什么不清楚或者不恰当的地方欢迎大家探讨)
假设 排序内存 = 100k,正好能盛下100条记录进行排序
当排序记录小于等于100条,ok,所有排序在内存中进行,很快
但若超过100条,则会使用临时表空间(利用磁盘进行)
1.当记录 >100 and <10000 的时候。(100的平方)
排序会使用1倍记录大小磁盘排序。见图二。(读写次数为 :只谈临时表空间读写:写一次排序记录 读一次排序记录)
2.当>10000 and <1000000,排序会使用2倍记录大小磁盘排序(只谈临时表空间的读写 写2次排序记录 读2次排序记录,可以自己去分析,用下面的图做参考.需要费点脑细胞)
假设需要排序的记录有10010条
这个时候我们进行的排序会分为101组进行
每读100条进行一次小组排序,然后写入磁盘,第101组只有10条,排序后也写入磁盘
这是进行第二次排序,这次排序将在前100小组里面各抽取一条进行排序。《按照我个人的猜测,应该是排好后每写入一条入磁盘则将该记录所在小组重新抽取一条出来进行排序(这时是有序记录组里面所以很快)》。当这个过程完成后,这时所需要的磁盘空间大约为 实际记录存储空间的2倍(这也是多数书上提到的排序空间大约是记录空间的2倍的原因)
由于还剩下10条记录,于是这10条记录需要跟前面排序的10000条记录进行排序合并,这个代价也是相当大的!
所以,我们通常推荐,假如你需要排序的记录最大为100万条,则内存排序最小要能装下1000条,否则如上面的例子,那多余的10条,仅仅10条将会带来巨大的代价!
如果,设置的极度不合理的情况下,排序记录达到了 内存排序所能容纳的三次方以上,比如上面例子中排序需要100万记录
那么同样的,重复这个过程,当每一万条记录如上排序后,再如上从这100小组(每组10000条记录)各抽一条进行排序……
在这个过程中,磁盘的消耗和时间的代价大家都应该有个感性认识了
所以,我们建议: 内存排序 所能容纳记录数至少大于排序记录数的 平方根。一旦超过资源消耗成2的次方的提高。
以上理论可能存在出入.抛砖引玉啊.要带思考去阅读.(一家之言语) |
|