[英]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 服务器作业,以便定期运行
因为我不知道这个查询返回多少行或者这个表/视图有多少行。
我可以为您提供一些简单的提示,这些提示可能对您提高查询性能有所帮助:
检查索引。 SQL 语句的 WHERE 和 JOIN 部分中使用的所有字段都应该有索引。
限制工作数据集的大小。
您只需要 select 列。
删除不必要的表格。
删除 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';
干杯!!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.