运行 带连接的查询的替代方法
Alternative way to run a query with join
我有以下查询:
select m.name, m.surname,m.teacher,
c.classroom,c.floor
from table1 as m
inner join table2 as c
on (m.name=c.name or m.surname = c.surname);
但是执行查询需要很多时间。我想问问有没有其他的方法运行呢
在我停止查询之前,查询尝试获取的行也是 ~47b。
如果查询执行的是交叉连接而不是内部连接,则此结果是合理的。
每个 table 有 14m 行。
OR
s 在 ON
子句中确实减慢了速度。您可以使用两个 LEFT JOIN
s:
select m.name, m.surname, m.teacher,
coalesce(cn.classroom, cs.classroom) as classroom,
coalesce(cn.floor, cs.floor) as floor
from table1 m left join
table2 cn
on m.name = cn.name left join
table2 cs
on m.surname = cs.surname
where cn.name is not null or cs.surname is not null
运行 使用 OR 运算符的连接查询导致 none-DBMS 的最佳执行计划。
试试这个:
select m.name, m.surname,m.teacher,c.classroom,c.floor
from table1 m inner join table2 as c
on m.name = c.name
UNION
select m.name , m.surname,m.teacher,c.classroom,c.floor
from table1 m inner join table2 as c
on m.surname = c.surname
考虑到您必须在两个表上声明名称和姓氏的索引
我有以下查询:
select m.name, m.surname,m.teacher,
c.classroom,c.floor
from table1 as m
inner join table2 as c
on (m.name=c.name or m.surname = c.surname);
但是执行查询需要很多时间。我想问问有没有其他的方法运行呢
在我停止查询之前,查询尝试获取的行也是 ~47b。
如果查询执行的是交叉连接而不是内部连接,则此结果是合理的。
每个 table 有 14m 行。
OR
s 在 ON
子句中确实减慢了速度。您可以使用两个 LEFT JOIN
s:
select m.name, m.surname, m.teacher,
coalesce(cn.classroom, cs.classroom) as classroom,
coalesce(cn.floor, cs.floor) as floor
from table1 m left join
table2 cn
on m.name = cn.name left join
table2 cs
on m.surname = cs.surname
where cn.name is not null or cs.surname is not null
运行 使用 OR 运算符的连接查询导致 none-DBMS 的最佳执行计划。
试试这个:
select m.name, m.surname,m.teacher,c.classroom,c.floor
from table1 m inner join table2 as c
on m.name = c.name
UNION
select m.name , m.surname,m.teacher,c.classroom,c.floor
from table1 m inner join table2 as c
on m.surname = c.surname
考虑到您必须在两个表上声明名称和姓氏的索引