JOIN的优化
描述
小表驱动大表是利用小表结果集,减少大表的捞取数据量,只有同时具有大表和小表时,才有可能走小表驱动大表优化。因此需要判断语句中是否同时存在大表和小表,并区分各个表是大表还是小表用于后续判定。
语法
- 大小表的判断标准:
小表和大表的区分不是根据表的原始数据来判断的,而是根据条件过滤后的数据来判断。
- 已知大表、小表分别是哪个时,对于简单的两表
JOIN语句,可以使用 hint 进行优化,提高查询效率。该 hint 为:/*+ leading(small_table_name) use_nl(big_table_name) */。
示例
SELECT /*+ leading(tb1) use_nl(tb2) */ tb1.colour, tb2.location FROMtb1 LEFT JOIN tb2 ON tb1.id=tb2.id AND tb1.location=tb2.location;
- 该 hint 支持两表做简单的
INNER JOIN、CROSS JOIN、逗号JOIN、LEFT JOIN、RIGHT JOIN或者 (+) 构成外联结的场景。 - 该功能对应有 CN 配置项
small_table_rows_num,用于配置小表数据量的上限值。配置项位于proxy.ini文件 [GENERAL] 段中,默认值为 0,表示不开启该优化。自动判断大小表需要用到表总行数,需要提前执行语句ANALYZE HISTOGRAM;用于获取当前时刻所有表的总行数;如果想使用表结果集的行数,则需要提前在关注的字段上额外建立直方图。
注意事项
- 获取的表行数是近似值,并不与表中实际数据量完全一致。
- 支持
SELECT、INSERT SELECT语句,不支持其他类型的语句。 - 支持
FROM子查询,不支持其他类型的子查询。 - 不支持语句中有跨层关联字段。
- 如果语句采用了其他优化手段,可能不再走该优化。
- 具体优化效果依表内数据和具体语句而定。
- 根据表数据量优化。
最后修改时间:2024-12-30 11:15:05
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




