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不是优化,重写查询的结果可能不同。如果不了解计划、选择性、数据结构等,则无法优化查询。请检查查询计划中的访问谓词,确保这些字段已编制索引。