一、表关联简单说明
表关联通常是通过 JOIN 操作来实现的。JOIN 操作可以基于两个或多个表之间的共同字段来组合这些表中的行。以下是几种常见的 JOIN 类型:
INNER JOIN (内联接): 仅返回两个表中匹配的行。
LEFT JOIN (左联接): 返回左表的所有行,即使右表中没有匹配的行。
RIGHT JOIN (右联接): 返回右表的所有行,即使左表中没有匹配的行。
FULL OUTER JOIN (全外联接): 返回两个表中的所有行,无论它们之间是否有匹配。
这边不具体展开讲解具体用法,可参考帮助手册。
二、表关联使用中一些注意事项
1.表连接中的每个表应指定缩写的别名,别名的命名尽量清晰可辨别;
SELECT e.employee_id, e.employee_name, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id;
2.建议一个 SQL 语句中多表关联的关联表不要超过10张表;
3.几个大小差不多的表做关联时,过滤性较强的优先做 JOIN ;
4.在大/大/小三个表内关联时,避免先把两个大表进行 JOIN ,除非过滤性非常强;
SELECT *
FROM (SELECT * FROM large_table1 a INNER JOIN small_table b ON a.key = b.key) a
INNER JOIN large_table2 c ON a.key = c.key
5.在大/小/小三个表内联时,优先把两个小表进行 JOIN :
SELECT *
FROM (smalltableA AS A INNER JOIN smalltableB AS B ON A.key=B.key)
INNER JOIN bigtable AS C ON C.key=A.key
6.在关联大表的时候,左右两个连接表的关联字段不能同时存在高重复值的情况,以免因重复记录关联产生巨大的中间结果,造成磁盘占用比例的大幅增长;例如:如果一个100万的重复记录表和一个1万的重复记录表关联,结果会高达100万*1万=100亿条记录;
在使用小表 LEFT JOIN 超大表(记录数过亿)时,强烈建议把 LEFT JOIN 修改为先 INNER JOIN ,再 LEFT JOIN 的方式实现。这样既可以提高性能,也能避免梧桐数据库产生大量的临时文件;因为在梧桐数据库中,对于 LEFT JOIN 语句,服务器会固定使用右表的记录,构造 Hash 表,然后用 Hash Join 的方式实现关联;如果右表非常大,会导致 Hash 表需要占用大量的内存,如果内存超出限制,系统会把 Hash 表的内容,写入到文件系统的临时文件中,如果右表是一个超大表,可能在执行此语句的时候,系统会写入大量临时文件,造成系统占用空间大幅增加; 如果是 INNER JOIN 语句,系统会自动选择用小表建立 Hash 表。
例如:如下 LEFT JOIN 语句:
select a.col.. from fileinter.test1 as a left join fileinter.test2 as b on a.id1=b.id1 and a.id2=b.id2;
如果 fileinter.test2 是一个超大表,那么 LEFT JOIN 可以改写如下 :
select a.col.. from fileinter.test1 as a left join (select b.id1,b.id2 from fileinter.test1 as a join fileinter.test2 as b on a.id1=b.id1 and a.id2=b.id2) as b on a.id1=b.id1 and a.id2=b.id2
7.表如果通过分布键关联时,不要使用表达式字段的方式进行关联,这是因为当分布键和关联键不一致时,数据需要重新分布以达到关联的效果,这可能会导致性能下降和资源浪费否则会导致数据重分布,举例如下:
错误的关联方式,导致数据重分布
Select a.col.. from fileinter.test1 AS A LEFT JOIN temp_result AS B ON trim(A.ci_cust_no)=B.ci_cust_no
正确的关联方式 ,为了避免数据重分布,建议在设计表结构和查询时,尽量使分布键和关联键一致。这样可以减少跨库查询的需要,提高查询效率。
Select a.col.. from fileinter.test1 AS A LEFT JOIN temp_result AS B ON A.ci_cust_no=B.ci_cust_no
author:xufeng