为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:8
【操作系统】:rhel linux
【CPU】:
【问题描述】*:
--不使用hint, 执行计划是正常的:
select a.owner,b.owner
from t1 a inner join t10m b
on a.object_id=b.object_id
where a.object_name='TAB$';
1 #NSET2: [1, 148->138, 204]
2 #PRJT2: [1, 148->138, 204]; exp_num(2), is_atom(FALSE)
3 #NEST LOOP INDEX JOIN2: [1, 148->138, 204]
4 #BLKUP2: [1, 1->1, 126]; IDX_T1_NAME(T1)
5 #SSEK2: [1, 1->1, 126]; scan_type(ASC), IDX_T1_NAME(T1), is_global(0), scan_range['TAB$','TAB$']
6 #BLKUP2: [1, 137->138, 30]; IDX_T10M_OBJECT_ID(T10M)
7 #SSEK2: [1, 137->138, 30]; scan_type(ASC), IDX_T10M_OBJECT_ID(T10M), is_global(0), scan_range[A.OBJECT_ID,A.OBJECT_ID]
--使用了hint, 没有使用对应的索引, 反而执行计划更差,这是为什么?
select /*+use_nl(a,b) index(b IDX_T10m_OBJECT_ID) */
a.owner,b.owner
from t1 a inner join t10m b on a.object_id=b.object_id
where a.object_name='TAB$';
1 #NSET2: [37302, 149->138, 204]
2 #PRJT2: [37302, 149->138, 204]; exp_num(2), is_atom(FALSE)
3 #SLCT2: [37302, 149->138, 204]; A.OBJECT_ID = B.OBJECT_ID
4 #NEST LOOP INNER JOIN2: [37302, 149->10000000, 204];
5 #BLKUP2: [1, 1->1, 126]; IDX_T1_NAME(T1)
6 #SSEK2: [1, 1->1, 126]; scan_type(ASC), IDX_T1_NAME(T1), is_global(0), scan_range['TAB$','TAB$']
7 #CSCN2: [1208, 10000000->10000000, 78]; INDEX33555591(T10M); btr_scan(1)
达梦的hint 也不是 必须走的。
USE_NL使用嵌套循环连接,但是T10M作为被驱动表用index hint一般不生效,需要用USE_NL_WITH_INDEX(驱动表名,被驱动索引名)来指定
因为是按NEST LOOP INNER JOIN走的吧,这面预估1行,他那面认为走个扫描正好NL,可以把use_nl(a,b)去了,再看看。或者改成USE_NL_WITH_INDEX