Oracle索引1–B树索引倒序扫描
在日常工作中会遇到某些查询,需要将最晚时间点数据显示在前面,然而这个表的数据量比较大可能是100G,500G,甚至更大,此时如果使用常规的order肯定查询不出来,Oracle提供了索引倒序扫描,然后能快速查询出结果集。 为什么倒序扫描会比较快,实际很简单,当数据插入进表时,oracle已经为索引键值排好序了(前导列排序),从左往右是按小到大排序的,那么一般扫描索引时也是从左往右扫描的,当需要将最大的时间数据在前面显示时几乎需要将整个索引全部扫描(有时会自动倒序扫描),这样IO肯定吃不消,效率很低。 那么,只能倒序扫描了。
写法很简单,只需要使用hint就行了,如:
select * from ( select * from ( select /* index_desc(t,索引名称)*/ t.* ,rownum rn from table_name t where t.time_ > xxx and t.time_ < xxx) where rn < 100) where rn > 50;
这是Oracle的分页写法,应该是比较标准的,分页一般就是这么写法。
另一种方式就是创建一个倒序索引,如: create index t_idx on table_name(time_ desc ,name_); 这种创建时,索引最左边的值就是最晚的时间插入的数据,好像数据就是往左增长一样,此时索引从左往右扫描的时候就是最大的时间了,也是比较实用的。
具体例子不在阐述,知道原理就行了,使用这种特性解决了大表的查询慢问题。