Sql 调整Oracle查询以实现慢速选择

Sql 调整Oracle查询以实现慢速选择,sql,oracle,Sql,Oracle,我正在处理一个oracle查询,它在一个巨大的表上执行select操作,但是与其他表的连接在处理时间上似乎花费了很多 我正在寻找有关如何改进此查询工作的提示 我附上一个版本的查询和解释计划 质疑 值得一提的是: 这个查询从oracle获取数据并将其发送到sql server数据库,所以我需要它这么大,我不能缩小查询的范围。 其目的是将其设置为带有SSIS的sql server作业,以便定期运行,因为我不知道此查询返回多少行或此表/视图有多少行 我可以为您提供一些简单提示,这些提示可能有助于提高

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

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

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

质疑

值得一提的是: 这个查询从oracle获取数据并将其发送到sql server数据库,所以我需要它这么大,我不能缩小查询的范围。
其目的是将其设置为带有SSIS的sql server作业,以便定期运行,因为我不知道此查询返回多少行或此表/视图有多少行

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

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

  • 限制工作数据集的大小

  • 只选择需要的列

  • 删除不必要的表

  • 删除JOIN和WHERE子句中的计算列

  • 尽可能使用内部联接,而不是外部联接


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

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

    干杯

    学会使用正确、明确、标准的
    JOIN
    语法!不管语法如何,似乎更多的是您使用的视图和缺少索引来提高性能的问题。我们需要表结构/视图定义吗?没有这一点,我们也就处于黑暗之中。。查询优化首先要知道数据类型、索引的位置以及它们的定义方式,因为在这种情况下,您很可能需要复合(多)列索引。“删除外部联接”听起来像是一个奇怪的建议。如果我真的需要外部连接怎么办。如果有的话,我认为这应该是“删除不必要的外部连接”,也可以添加到@a_horse_和_no_name的注释中,此处使用的外部连接在哪里,或者与问题相关?这是真的,我是这样理解的:)我已经删除了外部连接建议..但我提到它只是为了额外的提示…@RaymondNijlandI用这个建议和解释计划详细信息重新进行了查询,费用非常相似,谢谢你,它确实有帮助:)我确信它不会提高成本,因为根据您的解释计划,您的视图和其他表包含大量数据,并且它会尝试匹配内部查询中的每一行……因此我建议尽量限制您的查询,并仅使用所需信息限制行……是的,我没有澄清的事情,这个查询从oracle获取信息并将其发送到sql server数据库,所以我需要它这么大,我不能缩小查询的范围
    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';