什么是半连接
两个表做关联查询,只返回一个表的数据。比如IN或EXISTS。
半连接替换
IN 与 EXISTS相互替换
SELECT
COUNT(*)
FROM
AUTOPRINT.T_AUTOPRINT A
WHERE
A.ID IN
(
SELECT
S.AUTOPRINTID
FROM
AUTOPRINT.T_AUTOPRINTRESET S
);
执行耗时123毫秒
SELECT
COUNT(*)
FROM
AUTOPRINT.T_AUTOPRINT A
WHERE
EXISTS
(
SELECT
NULL
FROM
AUTOPRINT.T_AUTOPRINTRESET S
WHERE
S.AUTOPRINTID=A.ID
);
执行耗时120毫秒
使用内连接替换
SELECT
count(*)
FROM
AUTOPRINT.T_AUTOPRINT A
INNER JOIN
(
SELECT AUTOPRINTID FROM AUTOPRINT.T_AUTOPRINTRESET GROUP BY AUTOPRINTID
) S
on
A.ID = S.AUTOPRINTID;
执行耗时134毫秒
此时内连接的效率没有半连接好,因为子表多一个GROUP BY的去重操作。
内连接替换IN或EXIST注意一下内容
1、如果半连接中主表属于1的关系,子表(子查询中的表)属于n的关系,我们在改写为内连接的时候,需要加上GROUP BY去重。注意:这个时候半连接性能高于内连接。
2、如果半连接中主表属于n的关系,子表(子查询中的表)属于1的关系,我们在改写为内连接的时候,就不需要去重了。注意:这个时候半连接与内连接性能一样。
3、如果半连接中主表属于n的关系,子表(子查询中的表)也属于n的关系,这时我们可以先对子查询去重,将子表转换为1的关系,然后再关联,千万不能先关联再去重。