0

我一直在尝试优化以下查询的性能。我请求这个领域的所有专家给我一个帮助和建议。

我有应用程序。70k 条记录,我的要求是删除重复项。我需要提高以下查询的性能。

select *
  from x.vw_records
 where id not in
       (select distinct id
          from x.vw_datarecords
         where effective_date >= trunc(sysdate - 30)
           and book in (select book_shortname from x.vw_datarecords))
union
select distinct id
  from x.vw_historyrecords
 where effective_date >= trunc(sysdate - 30)
   and book in (select book_shortname from x.vw_datarecords)
union
select distinct id
  from x.vw_transactiondata
 where effective_date >= trunc(sysdate - 30)
   and book in (select book_shortname from x.vw_datarecords);
union
  select distinct id
    from x.vw_cashdata
   where effective_date >= trunc(sysdate - 30)
     and book in (select book_shortname from x.vw_datarecords)

目前需要十分钟来数数。使用计数(*)的行数。建议我调整此查询的性能的任何想法。

提前致谢。

4

3 回答 3

2

我总是发现用左连接 + where iS NULL 换出 NOT IN(查询)的性能更好

示例而不是:

select *
from x.vw_records
where id not in (
    select distinct id
    from x.vw_datarecords
    where effective_date >= trunc(sysdate - 30)
        and book in (
            select book_shortname from x.vw_datarecords
        )

利用:

select *
from x.vw_records vr
left join vw_datarecords vdr on vr.id = vdr.id
    and effective_date >= trunc(sysdate - 30)
        and book in (
            select book_shortname from x.vw_datarecords
        )
where vdr.id IS NULL

此外,有时你可以通过 group by 而不是 distinct 获得明显更好的性能。

于 2014-07-05T00:46:09.260 回答
1

我怀疑你需要索引。您在查询中涉及的表上有哪些索引?

& 是时候学习如何使用“解释计划”了,它是查询优化的重要工具。得到一个并不难。然而,它们可能有点难以理解。请在您的问题中包含解释计划输出。

    EXPLAIN PLAN FOR
      <<Your SQL_Statement here>>
    ;

    SET LINESIZE 130
    SET PAGESIZE 0
    SELECT * FROM table(DBMS_XPLAN.DISPLAY);

当您使用“union”时,使用“select distinct”绝对是零好处,不要两者都做,只做一个。

于 2014-07-05T00:29:31.240 回答
0

如果您可以尝试使用存在/不存在子句代替 in/not in ( http://www.techonthenet.com/sql/exists.php )。这通常运行得更快。

于 2014-07-04T14:50:38.340 回答