繁体   English   中英

调优 Oracle 查询慢速 select

[英]Tuning Oracle Query for slow select

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

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

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

询问

 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 服务器数据库,所以我需要它这么大,我不能缩小查询的 scope。 目的是将其设置为具有 SSIS 的 sql 服务器作业,以便定期运行

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

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

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

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

  3. 您只需要 select 列。

  4. 删除不必要的表格。

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

  6. 如果可能,请使用内连接,而不是外连接。

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

一个明显的建议是不要在 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';

干杯!!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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