【问题标题】:My query takes too long to complete我的查询需要很长时间才能完成
【发布时间】:2011-10-06 18:04:45
【问题描述】:

我有一个查询需要很长时间才能在 Oracle 中完成。在我杀死它之前它运行了几个小时。有什么办法可以加快速度吗?

这是我的查询:

select distinct(random_selection.randnum), 
    random_selection.dropper_id, 
    random_selection.ozip3 
from random_selection 
where random_selection.dropper_id is not null 
and random_selection.quarter = 121
and (random_selection.dropper_id, random_selection.randnum, random_selection.quarter) in 
    (select forecast_entry.dropper, forecast_entry.rand_num, production_weeks.yyq 
    from forecast_entry, production_weeks 
    where forecast_entry.week = production_weeks.production_week 
    and production_weeks.project_cd = 'EXFC' 
    and production_weeks.yyq >= 121)

union 

select distinct(random_selection.randnum), 
    dropper_city_brk_2.dropper_id, 
    random_selection.ozip3 
from random_selection, dropper_city_brk_2, dropper 
where random_selection.ozip3 = dropper_city_brk_2.zip3 
and dropper.dropper_id = dropper_city_brk_2.dropper_id 
and dropper.active = 1 
and dropper_city_brk_2.dropper_id <> 10002 
and random_selection.quarter = 121
and random_selection.dropper_id is null 
and (random_selection.dropper_id, random_selection.randnum, random_selection.quarter) in 
    (select forecast_entry.dropper, forecast_entry.rand_num, production_weeks.yyq 
    from forecast_entry, production_weeks 
    where forecast_entry.week = production_weeks.production_week 
    and production_weeks.project_cd = 'EXFC' 
    and production_weeks.yyq >= 121)

查询解释:

主要目标是从random_selection 表中获取所有randnum、dropper_id 和ozip3,它们不在forecast_entry 表中,并且在yyq 121 中并且具有EXFC 的项目代码。通过关联周和生产周从生产周表中检索 yyq。一些 dropper_id 为空,因此我们需要通过关联 ozip3 和 zip3 从 dropper_city_brk_2 表中提取该数据。我们不希望 dropper_id 处于非活动状态,因此它们的活动必须等于 1,这是通过关联 dropper 表来实现的。

希望对你有帮助

【问题讨论】:

  • 您应该在问题中包含您的表架构以及您设置的任何索引。
  • 这是我一生中见过的最大的 SQL 查询 :) 阅读它需要稍作休息
  • 我见过更大的......
  • 除了显示您的架构之外,还显示 EXPLAIN PLAN 的输出
  • 迈克,我们并不都是通灵者,您需要发布表格结构、索引、表格大小并解释我们帮助您的计划。还要检查您的数据库统计信息是否是最新的。

标签: sql performance oracle


【解决方案1】:

我同意评论者的观点,即您至少应该在要点中提供解释明文的输出,否则很难提供帮助。

您正在运行两次 forecast_entry、production_weeks 子查询。使用 CREATE TEMPORARY TABLE 计算一次查询可能会获得更好的性能。

您正在使用“where X in (subquery)”,这通常比执行连接效率低。除了在此处使用 IN 子句,您还可以对我刚才建议的临时表执行 INNER JOIN。

如果您可以容忍重复,或者如果您知道没有重复,则可以切换到 UNION ALL。 UNION ALL 比 UNION 需要更少的数据库工作。

最后,您可以将其分成三部分并分别进行测试。这些部分是子查询和您要联合的两个查询。这可能会帮助您缩小速度较慢的部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 2016-07-30
    • 2013-07-18
    相关资源
    最近更新 更多