注册

多表连接中基于范围查询条件的优化

exudong 2023/02/08 795 0

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【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 &lt; 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可以提示对范围条件的推导、优化吗?

回答 0
暂无回答
扫一扫
联系客服