请问在记录数为5万条时,select * from table order by id desc,是查询耗时还是排序耗时? 如题 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 加了desc,时间是否会大大超过不加desc的时候 看你的数据存储方式,你可以打开set autotrace on看看每一步的cost.很难说那个花更多的时间。加了desc后,不会加大运行时间的。 肯定是排序耗时,有篇文章http://blog.csdn.net/biti_rainy/archive/2004/06/30/learn_oracle_20040630_2.aspx说针对每个session,排序首先会使用sort_area_size ,如果不足则会使用临时表空间。但这里面又到底是怎么一个过程呢?下面阐述一下,也许对大家有用处(如果有什么不清楚或者不恰当的地方欢迎大家探讨) 假设sort_area_size = 100k,正好能盛下100条记录进行排序,当排序记录小于等于100条,ok,所有排序在内存中进行,很快,但若超过100条,则会使用临时表空间(利用磁盘进行)我们选取一个临界值来说明,假设需要排序的记录有10010条,这个时候我们进行的排序会分为101组进行,每读100条进行一次小组排序,然后写入磁盘,第101组只有10条,排序后也写入磁盘. 这是进行第二次排序,这次排序将在前100小组里面各抽取一条进行排序。《按照我个人的猜测,应该是排好后每写入一条入磁盘则将该记录所在小组重新抽取一条出来进行排序(这时是有序记录组里面所以很快)》。当这个过程完成后,这时所需要的磁盘空间大约为 实际记录存储空间的2倍(这也是多数书上提到的排序空间大约是记录空间的2倍的原因),由于还剩下10条记录,于是这10条记录需要跟前面排序的10000条记录进行排序合并,这个代价也是相当大的! 所以,我们通常推荐,假如你需要排序的记录最大为100万条,则sort_area_size最小要能装下1000条,否则如上面的例子,那多余的10条,仅仅10条将会带来巨大的代价!如果,设置的极度不合理的情况下,排序记录达到了 sort_area_size所能容纳的三次方以上,比如上面例子中排序需要100万记录,那么同样的,重复这个过程,当每一万条记录如上排序后,再如上从这100小组(每组10000条记录)各抽一条进行排序…… 在这个过程中,磁盘的消耗和时间的代价大家都应该有个感性认识了。所以,我们建议: sprt_area_size 所能容纳记录数至少大于排序记录数的 平方根。 从 9i开始oracle用 PGA_AGGREGATE_TARGET 来取代了 关于 session 级别的一些设置,也就是说,当 workarea_size_policy = AUTO 的时候,所有 *_area_size 都不在session级别设置了(仅仅针对dedicated模式的session而不针对 shared 模式),这些 session 共享数据库instance级别共同设置的 PGA_AGGREGATE_TARGET show parameters areaNAME TYPE VALUE------------------------------------ ----------- ------------------------------bitmap_merge_area_size integer 1048576create_bitmap_area_size integer 8388608hash_area_size integer 248576sort_area_retained_size integer 0sort_area_size integer 124288workarea_size_policy string AUTO并且各 session 使用 PGA_AGGREGATE_TARGET 遵循一个规则,那就是每个 session 使用空间不能超过 PGA_AGGREGATE_TARGET * 5% ,若超过则使用 临时表空间 加where 子句,没有的条件可以加个1=1之类的。不然它不会使用主键索引。或者用其他方法强制它使用索引 order by id ?在索引的属性中有一个cluster的属性 如果表中的记录大部分是按id排序好了的 我想在排序上应该会好的多吧 这是我的推理 没试验过 而且selct * from table 这个应该不会用到index 吧 问大家出现的严重错误是什么问题? 花钱让Oracle同仁们给我解决Oracle的作业 Oracle Linux环境下,大数据量的导入! oracle游标的问题 初学,希望各位大侠指出下面注释的部分哪里错了!!! 请教,安装oracle10g对计算机有什么要求? 如何启动ORACLE数据库啊 ***oracle的存储过程怎么写?**** 为什么我的定时操作不能在规定时刻执行?麻烦大家帮我看一下 哪位大哥能帮我优化一下这条SQL语句 关于oracle数据库导入 即SQL*LOADER的问题 怎么取大于或等于一个数的最小整数?
http://blog.csdn.net/biti_rainy/archive/2004/06/30/learn_oracle_20040630_2.aspx说
针对每个session,排序首先会使用sort_area_size ,如果不足则会使用临时表空间。但这里面又到底是怎么一个过程呢?下面阐述一下,也许对大家有用处(如果有什么不清楚或者不恰当的地方欢迎大家探讨) 假设sort_area_size = 100k,正好能盛下100条记录进行排序,当排序记录小于等于100条,ok,所有排序在内存中进行,很快,但若超过100条,则会使用临时表空间(利用磁盘进行)我们选取一个临界值来说明,假设需要排序的记录有10010条,这个时候我们进行的排序会分为101组进行,每读100条进行一次小组排序,然后写入磁盘,第101组只有10条,排序后也写入磁盘. 这是进行第二次排序,这次排序将在前100小组里面各抽取一条进行排序。《按照我个人的猜测,应该是排好后每写入一条入磁盘则将该记录所在小组重新抽取一条出来进行排序(这时是有序记录组里面所以很快)》。当这个过程完成后,这时所需要的磁盘空间大约为 实际记录存储空间的2倍(这也是多数书上提到的排序空间大约是记录空间的2倍的原因),由于还剩下10条记录,于是这10条记录需要跟前面排序的10000条记录进行排序合并,这个代价也是相当大的! 所以,我们通常推荐,假如你需要排序的记录最大为100万条,则sort_area_size最小要能装下1000条,否则如上面的例子,那多余的10条,仅仅10条将会带来巨大的代价!如果,设置的极度不合理的情况下,排序记录达到了 sort_area_size所能容纳的三次方以上,比如上面例子中排序需要100万记录,那么同样的,重复这个过程,当每一万条记录如上排序后,再如上从这100小组(每组10000条记录)各抽一条进行排序…… 在这个过程中,磁盘的消耗和时间的代价大家都应该有个感性认识了。所以,我们建议: sprt_area_size 所能容纳记录数至少大于排序记录数的 平方根。 从 9i开始oracle用 PGA_AGGREGATE_TARGET 来取代了 关于 session 级别的一些设置,也就是说,当 workarea_size_policy = AUTO 的时候,所有 *_area_size 都不在session级别设置了(仅仅针对dedicated模式的session而不针对 shared 模式),这些 session 共享数据库instance级别共同设置的 PGA_AGGREGATE_TARGET show parameters areaNAME TYPE VALUE
------------------------------------ ----------- ------------------------------
bitmap_merge_area_size integer 1048576
create_bitmap_area_size integer 8388608
hash_area_size integer 248576
sort_area_retained_size integer 0
sort_area_size integer 124288
workarea_size_policy string AUTO并且各 session 使用 PGA_AGGREGATE_TARGET 遵循一个规则,那就是每个 session 使用空间不能超过 PGA_AGGREGATE_TARGET * 5% ,若超过则使用 临时表空间
在索引的属性中有一个cluster的属性
如果表中的记录大部分是按id排序好了的 我想在排序上应该会好的多吧
这是我的推理 没试验过
而且selct * from table 这个应该不会用到index 吧