简体   繁体   中英

how to reduce cost

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))

In inv_dist_stg table already has index on column interface_line_id

in would be much slow, use a join instead. The query is like this:

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)

create indexes on status and creation_date

and then you are good to go!!!

Your query looks fine. It is good that your table has a index on interface_line_id . Thus you can quickly access that you find in your subquery.

Now you need an index for the subquery. That is an index that should include status and creation_date . As I don't know which is more selective, you may want to try two indexes and see which one is used by the DBMS. I suppose that trun is a typo and means trunc actually. You can now either create an index on trunc(creation_date) or change the query to use creation_date without trunc . At last you want the index to include interface_line_id which is needed for the main query.

I suggest

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
);

and

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);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM