为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:v8
【操作系统】:linux
【CPU】:
【问题描述】:
object_id字段上有索引(不唯一), 可为null, 下面取top 10的SQL, 除了创建object_id desc索引外, 是否还有其他优化方法?
分别试过/+ TOP_ORDER_OPT_FLAG(0) / 和 /+ TOP_ORDER_OPT_FLAG(1) */ 两个hint, 没有效果. sql_text如下:
select owner,object_name,object_id
from t10m
order by object_id desc
limit 10;
执行计划如下:
1 #NSET2: [138863, 10->10, 180]
2 #PRJT2: [138863, 10->10, 180]; exp_num(4), is_atom(FALSE)
3 #SORT3: [138863, 10->10, 180]; key_num(1), partition_key_num(0), is_distinct(FALSE), is_adaptive(0), MEM_USED(7872KB), DISK_USED(0KB)
4 #NEST LOOP INDEX JOIN2: [138862, 10->10, 180]
5 #DISTINCT: [138862, 10->10, 42], MEM_USED(18KB), DISK_USED(0KB)
6 #PRJT2: [138722, 10->10, 42]; exp_num(1), is_atom(FALSE)
7 #PRJT2: [138722, 10->10, 42]; exp_num(1), is_atom(FALSE)
8 #SORT3: [138722, 10->10, 42]; key_num(1), partition_key_num(0), is_distinct(FALSE), is_adaptive(0), MEM_USED(6144KB), DISK_USED(0KB)
9 #SSCN: [1135, 10000000->10000000, 42]; IDX_T10M_OBJECT_ID(T10M); btr_scan(1); is_global(0)
10 #CSEK2: [1, 1->10, 0]; scan_type(ASC), INDEX33555591(T10M), scan_range[DMTEMPVIEW_889488286.colname,DMTEMPVIEW_889488286.colname]
(limit的写法比rownum写法效率要高一点, 应该是使用了延迟关联的查询转换)
另外, TOP_ORDER_OPT_FLAG 这个hint, 不知道正确的使用场景是什么?
一个简单的Top N查询, 涉及的知识点还真不少啊, 我一个oracle优化老司机都快折腾晕了.
补充:
增加where object_id >0 条件, 有时会使用降序扫描, 有时又不使用, 这个是否有参数或hint可以控制?