简单陈述一下 针对每个session排序首先会使用sort_area_size 如果不足则会使用临时表空间但这里面又到底是怎么一个过程呢?下面阐述一下也许对大家有用处(如果有什么不清楚或者不恰当的地方欢迎大家探讨) 假设sort_area_size = k正好能盛下条记录进行排序 当排序记录小于等于条ok所有排序在内存中进行很快 但若超过条则会使用临时表空间(利用磁盘进行) 我们选取一个临界值来说明假设需要排序的记录有条 这个时候我们进行的排序会分为组进行 每读条进行一次小组排序然后写入磁盘第组只有条排序后也写入磁盘 这是进行第二次排序这次排序将在前小组里面各抽取一条进行排序《按照我个人的猜测应该是排好后每写入一条入磁盘则将该记录所在小组重新抽取一条出来进行排序(这时是有序记录组里面所以很快)》当这个过程完成后这时所需要的磁盘空间大约为 实际记录存储空间的倍(这也是多数书上提到的排序空间大约是记录空间的倍的原因) 由于还剩下条记录于是这条记录需要跟前面排序的条记录进行排序合并这个代价也是相当大的! 所以我们通常推荐假如你需要排序的记录最大为万条则sort_area_size最小要能装下条否则如上面的例子那多余的条仅仅条将会带来巨大的代价! 如果设置的极度不合理的情况下排序记录达到了 sort_area_size所能容纳的三次方以上比如上面例子中排序需要万记录 那么同样的重复这个过程当每一万条记录如上排序后再如上从这小组(每组条记录)各抽一条进行排序…… 在这个过程中磁盘的消耗和时间的代价大家都应该有个感性认识了 所以我们建议 sprt_area_size 所能容纳记录数至少大于排序记录数的 平方根 oracle文档 |