SQL查询其中IN(子查询)

时间:2018-03-26 06:08:12

标签: sql oracle

我在ORACLE中查询,其中从另一个表中选择引用。 但问题是需要花很多时间才能完成。 如果我修复参数,它可以更快地返回结果集。

这是代码A和B

这是代码A,只需要在视图上选择25秒

SELECT LOTID, CHARACTERVALUE, ITEMPROMPT
FROM TRES_RAWDATA_LOT
WHERE LOTID in
(
'CO5383.1',
'CO5384.1',
'CO5385.1');

然后我尝试在表名 SAPLOTID 上传三条记录 这是代码

SELECT LOTID, CHARACTERVALUE, ITEMPROMPT
FROM TRES_RAWDATA_LOT
WHERE LOTID in
(SELECT LOTID FROM SAPLOTID);

为什么代码B需要花费很多时间。 任何建议? 我需要创建索引吗? 它会影响使用同一个表的不同SP吗?

感谢

3 个答案:

答案 0 :(得分:0)

LOTID索引很可能会有所帮助,是的(正如你已经知道的那样)。

您可能想尝试另一种选择:

select t.lotid, t.charactervalue, t.itemprompt
from tres_rawdata_lot t
where exists (select null 
              from saplotid s
              where s.lotid = t.lotid);

答案 1 :(得分:0)

查询分析器现在可能不会SAPLOTID中只有几行。然后它将避免索引查找,这对于小行集很快,但对于大行集很危险。试着告诉它行数:

SELECT /*+ FIRST_ROWS(10) */ LOTID, CHARACTERVALUE, ITEMPROMPT
FROM TRES_RAWDATA_LOT
WHERE LOTID in
(SELECT LOTID FROM SAPLOTID);

或者提示使用索引:

SELECT /*+ INDEX(TRES_RAWDATA_LOT name_of_index_here) */
       LOTID, CHARACTERVALUE, ITEMPROMPT
FROM TRES_RAWDATA_LOT
WHERE LOTID in
(SELECT LOTID FROM SAPLOTID);

答案 2 :(得分:0)

尝试使用连接来查找数据,而不是使用IN(...):

SELECT A.LOTID, A.CHARACTERVALUE, A.ITEMPROMPT
FROM TRES_RAWDATA_LOT A
INNER JOIN 
SAPLOTID B 
ON A.LOTID = B.LOTID

如果仍然很慢,请检查表SAPLOTID中是否有LOTID列的索引。

根据我的经验,如果你可以用连接做一些事情,那么这通常是最快的方式(至少在我使用的Oracle中)。