【问题标题】:Tuning Oracle Query for slow select为慢速选择调整 Oracle 查询
【发布时间】:2019-09-26 19:11:44
【问题描述】:

我正在处理一个在一个巨大的表上进行选择的 oracle 查询,但是与其他表的连接似乎在处理时间方面花费了很多。

我正在寻找有关如何改进此查询工作的提示。

我附上了一个版本的查询和它的解释计划。

查询

 SELECT
    l.gl_date,
    l.REST_OF_TABLES
    (
        SELECT
            MAX(tt.task_id)
        FROM
            bbb.jeg_pa_tasks tt
        WHERE
            l.project_id = tt.project_id
            AND l.task_number = tt.task_number
    ) task_id
FROM
    aaa.jeg_labor_history   l,
    bbb.jeg_pa_projects_all     p
WHERE
    p.org_id = 2165
    AND l.project_id = p.project_id
    AND p.project_status_code = '1000'

有一点要提: 这个查询从oracle取数据发送到sql server数据库,所以需要这么大,不能缩小查询范围。 目的是将其设置为带有 SSIS 的 sql server 作业,以便定期运行

【问题讨论】:

  • 学习使用正确、明确、标准 JOIN 语法!
  • 无论语法如何,这似乎更多是您正在使用的视图和缺少索引以提高性能的问题。
  • 我们需要表结构/视图定义吗?没有它,我们也处于黑暗之中。查询优化首先要了解数据类型、索引的位置以及它们是如何定义的,因为在这种情况下,您最有可能需要复合(多)列索引。

标签: sql oracle


【解决方案1】:

一个明显的建议是不要在 select 子句中使用子查询。

相反,您可以尝试加入表格。

SELECT
    l.gl_date,
    l.REST_OF_TABLES
    t.task_id
FROM
    aaa.jeg_labor_history   l
    Join bbb.jeg_pa_projects_all p
    On (l.project_id = p.project_id)
    Left join (SELECT
        tt.project_id, 
        tt.task_number,
        MAX(tt.task_id) task_id
    FROM
        bbb.jeg_pa_tasks tt
    Group by tt.project_id, tt.task_number) t
    On (l.project_id = t.project_id
            AND l.task_number = t.task_number)
WHERE
    p.org_id = 2165
    AND p.project_status_code = '1000';

干杯!!

【讨论】:

  • 我用这个建议重做了查询,解释计划详细说明了一个非常相似的成本,无论如何谢谢你,它确实有帮助:)
  • 我确信它不会提高成本,因为根据您的解释计划,您的视图和其他表包含大量数据,并且它会尝试匹配您内部查询中的每一行...所以我建议尝试尽可能地限制您的查询并限制仅包含所需信息的行...
  • 是的,我没有澄清的事情,这个查询从oracle获取信息发送到sql server数据库,所以我需要它这么大,我不能缩小范围查询的
【解决方案2】:

因为我不知道这个查询返回多少行或者这个表/视图有多少行。

我可以为您提供一些简单的提示,这些提示可能对您提高查询性能有所帮助:

  1. 检查索引。 SQL 语句的 WHERE 和 JOIN 部分中使用的所有字段都应该有索引。

  2. 限制工作数据集的大小。

  3. 仅选择您需要的列。

  4. 删除不必要的表。

  5. 删除 JOIN 和 WHERE 子句中的计算列。

  6. 尽可能使用内连接,而不是外连接。

您的视图包含大量数据,因此您也可以分解并仅限制您需要从此视图中获取的信息

【讨论】:

  • "Remove OUTER JOINS" 听起来像是一个奇怪的建议。如果我确实需要外部连接怎么办。如果有的话,我认为应该是“删除不必要的外部连接”
  • 还要添加到@a_horse_with_no_name 的评论中,这里使用的外连接在哪里或与问题相关?
  • 这是真的,我是这样理解的:)
  • 我已经删除了外部加入建议..但我提到它只是为了提供额外的提示......@RaymondNijland
猜你喜欢
  • 2012-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-29
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多