我在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吗?
感谢
答案 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中)。