为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】: V8
【操作系统】:
【CPU】:
【问题描述】*:
(在同一个表上做连接操作是为了测试,请忽略)
(1) 在如下的 SQL中 外表过滤条件为 a.id = 100000
, 数据库参够通过 表连接关系 a.id = b.id
推导出 b表的过虑订件也是 b.id = 100000
所以这个查询询性能非常高。
SQL> explain select a.id , b.code from products as a left join products as b on a.id = b.id where a.id = 1000000;
1 #NSET2: [6, 1, 64]
2 #PRJT2: [6, 1, 64]; exp_num(2), is_atom(FALSE)
3 #NEST LOOP LEFT JOIN2: [6, 1, 64]; partition_keys_num(0) ret_null(0)
4 #SSEK2: [1, 1, 8]; scan_type(ASC), INDEX33555484(products as a), scan_range[exp_cast(1000000),exp_cast(1000000)]
5 #BLKUP2: [1, 1, 56]; INDEX33555484(b)
6 #SSEK2: [1, 1, 56]; scan_type(ASC), INDEX33555484(products as b), scan_range[exp_cast(1000000),exp_cast(1000000)]
(2) 如下将查询条件 更改为 a.id >= 1000000 and a.id < 1000010
, 数据库没有推导出 b.id >= 1000000 and b.id < 1000010
对b表做了全表扫描。
SQL> explain select a.id , b.code from products as a left join products as b on a.id = b.id where a.id >= 1000000 and a.id < 1000010;
1 #NSET2: [1926, 367232, 8]
2 #PRJT2: [1926, 367232, 8]; exp_num(2), is_atom(FALSE)
3 #HASH LEFT JOIN2: [1926, 367232, 8]; key_num(1), partition_keys_num(0), ret_null(0), mix(0) KEY(a.id=b.id)
4 #SSEK2: [47, 367232, 8]; scan_type(ASC), INDEX33555484(products as a), scan_range[exp_cast(1000000),exp_cast(1000010))
5 #CSCN2: [1139, 9792856, 56]; INDEX33555483(products as b)
(3) 如下SQL显式增加 b.id >= 1000000 and b.id < 1000010
后,数据库对b表使用了索引。
SQL> explain select a.id , b.code from products as a left join products as b on a.id = b.id where a.id >= 1000000 and a.id < 1000010 and b.id >= 1000000 and b.id < 1000010 ;
1 #NSET2: [492, 13771, 64]
2 #PRJT2: [492, 13771, 64]; exp_num(2), is_atom(FALSE)
3 #HASH2 INNER JOIN: [492, 13771, 64]; LRKEY_UNIQUE KEY_NUM(1); KEY(a.id=b.id) KEY_NULL_EQU(0)
4 #SSEK2: [47, 367232, 8]; scan_type(ASC), INDEX33555484(products as a), scan_range[exp_cast(1000000),exp_cast(1000010))
5 #BLKUP2: [371, 367232, 56]; INDEX33555484(b)
6 #SSEK2: [371, 367232, 56]; scan_type(ASC), INDEX33555484(products as b), scan_range[exp_cast(1000000),exp_cast(1000010))
因为编写SQL时一般只写主表的条件,这里有什么HINT可以提示对范围条件的推导、优化吗?