[英]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.