select *
from inv_dist_stg(table_name)
where interface_line_id in (select interface_line_id from inv_lines_stg
where status = 'processed'
and trun(creation_date) <= (trun(sysdate)-10))在inv_dist_stg表中已经有了列interface_line_id上的索引
发布于 2021-12-16 12:49:28
in会慢得多,使用一个连接代替。查询如下:
select *
from inv_dist_stg a,inv_lines_stg b
where a.interface_line_id=b.interface_line_id
and b.status = 'processed' and trun(b.creation_date) <= (trun(sysdate)-10)在status和creation_date上创建索引
然后你就可以走了!
发布于 2021-12-16 13:03:32
你的查询看起来很好。您的表在interface_line_id上有一个索引,这很好。因此,您可以快速访问在子查询中找到的内容。
现在,您需要子查询的索引。这是一个应该包括status和creation_date的索引。由于我不知道哪个更有选择性,您可能需要尝试两个索引,并查看DBMS使用哪个索引。我认为trun是一个错误,实际上意味着trunc。现在,您可以在trunc(creation_date)上创建索引,也可以将查询更改为不使用trunc的creation_date。最后,您希望索引包含主查询所需的interface_line_id。
我建议
select *
from inv_dist_stg
where interface_line_id in
(
select interface_line_id
from inv_lines_stg
where status = 'processed'
and creation_date < trunc(sysdate) - 9
);和
create index idx1 on inv_dist_stg (status, creation_date, interface_line_id);
create index idx2 on inv_dist_stg (creation_date, status, interface_line_id);https://stackoverflow.com/questions/70334622
复制相似问题