Sql 联接中的优化查询
我有一个问题:Sql 联接中的优化查询,sql,oracle,Sql,Oracle,我有一个问题: Select a.VD, a.VEXT, c.evalu from val_tb a, carin b, mapos c where a.VA_record_id in (Select reD from val_tb where valnum = 100008533 and VD=1887) and a.VD in(1890) and a.varnum=1 and b.sname = 'cat' and a.VEXT = b.source_pos_id and b.po
Select a.VD, a.VEXT, c.evalu from val_tb a, carin b, mapos c
where a.VA_record_id in
(Select reD from val_tb where valnum = 100008533 and VD=1887)
and a.VD in(1890)
and a.varnum=1
and b.sname = 'cat'
and a.VEXT = b.source_pos_id
and b.posd = c.posid;
是否可以在Oracle中将其转换为联接查询 您正在使用连接,只是使用了一个糟糕的语法。您的查询应该如下所示:
Select a.VD, a.VEXT, c.evalu
from val_tb a join
carin b
on a.VEXT = b.source_pos_id join
mapos c
on b.posd = c.posid
where a.VA_record_id in (Select reD from val_tb where valnum = 100008533 and VD=1887) and
a.VD in (1890) and
a.varnum = 1 and
b.sname = 'cat';
这应该有相同的执行计划
简单规则:在FROM
子句中不要使用逗号;始终使用显式JOIN
语法
对于性能,您需要索引。确保子句上的
中的所有列都有索引(如果它们有主键,则会有索引)。然后对于IN
子句中的,您需要在val_tb(valnum,vd,reD)
上建立一个索引,或者为where
子句建立另一个索引。使用ANSI连接语法,避免使用旧的Oracle连接语法
SELECT a.vd,
a.vext,
c.evalu
FROM val_tb a
join val_tb d
ON A.va_record_id = d.red
join carin b
ON A.vext = b.source_pos_id
join mapos c
ON b.posd = c.posid
WHERE d.valnum = 100008533
AND d.vd IN ( 1887, 1890 )
AND a.varnum = 1
AND b.sname = 'cat';
有可能优化它吗?可能是左连接?@dang left join不是优化,重写查询的结果可能不同。如果不了解计划、选择性、数据结构等,则无法优化查询。请检查查询计划中的访问谓词,确保这些字段已编制索引。