【问题标题】:Slow Query performance due to not exists in oracle由于在 oracle 中不存在,查询性能变慢
【发布时间】:2019-08-01 10:48:32
【问题描述】:

这是我的查询,执行它需要更多时间,任何人都可以让它更快!!! 我认为不存在会导致更耗时,但我不知道如何将其转换为具有更多条件的左外连接我已经更改了很多次,但结果也随之更改。

提前致谢。

【问题讨论】:

  • 这是一个很长的查询,您没有提供有关数据或数据结构的详细信息,也没有提供您正在实现的业务逻辑。而且看起来你有一个嵌入式函数调用PCK_TAX_PERIOD.TXPRD_DATE_FN():这是做什么的?你不能指望我们重写一个查询,而不知道它应该做什么。请阅读this post on Oracle tuning,然后编辑您的问题以提供我们需要的更多信息。
  • @APC 我已经更新了我只需要转换不存在加入以提高查询执行速度的查询!!!
  • 您在问题中说您无法在不影响结果集的情况下进行更改。这是您的数据模型和业务规则。所以我认为我们不太可能在完全无知的情况下做到这一点。如果您发布一些带有所需输出的示例输入数据,那么有人可能会为您进行所需的手术。
  • 您的连接条件 ( tabi.tax_account_No=ta.tax_account_no and tt.tax_Type_No!=2) OR( tt.tax_Type_No=2) 看起来很奇怪 - 您真的希望所有 tt.tax_type_no = 2 行都连接到每一行,而不管 tax_account_no 是什么?
  • “我认为不存在的原因” 无需猜测。阅读alter session set statistics_level=all;DBMS_XPLAN.DISPLAY_CURSOR。它会准确地告诉您执行计划中的哪些步骤需要最多的工作。

标签: oracle query-optimization not-exists


【解决方案1】:

根据基本调优原则,如果内部使用的查询不存在或存在有大量数据,则使用存在或不存在。如果它没有大量数据,则使用 IN 或 NOT IN 代替

同时删除 SELECT DISTINCT t.tax_payer_no、taxtab.estab_no 中的 distinct 并在 CTE 查询中使用它,看看它花费了多少时间

  with data as (
    SELECT t.tax_payer_no tax_payer_no,taxestab.estab_no estab_no.. rest of your query)
  select count(1),tax_payer_no,estab_no from data
     group by tax_payer_no,estab_no

【讨论】:

  • 不,兄弟!不是 IN() 也会降低性能!!!我想将 NOT EXISTS() 更改为左外连接!!!有可能吗???
  • 您能否发布 NOT EXISTS 和 NOT IN 的查询时间
  • 在 NOT IN 中,时间是:在 191.627 秒内获取 50 行,在 NOT EXISTS 中:在 179.025 秒内获取 50 行
  • 删除SELECT DISTINCT t.tax_payer_no、taxtab.estab_no中的distinct并在外部查询中使用它,看看它花了多少时间
猜你喜欢
  • 1970-01-01
  • 2014-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-04
  • 1970-01-01
相关资源
最近更新 更多