我做了一個可以工作的查詢,但在我看來有點慢。當我將輸出壓縮到10行時,執行查詢需要13分鐘。這是查詢,從一些東西剝離:在Oracle SQL中優化慢相關查詢
SELECT
(SELECT ANSWER
FROM (
SELECT to_number(fiit.ANSWER, '999') ANSWER,
foin.CLIENT_ID id,
foin.STARTDATE start_date,
row_number() over(PARTITION BY foin.CLIENT_ID ORDER BY foin.FORM_ID ASC) rnk
FROM forms_filled foin, forms_items_filled fiit, treatment trtm
WHERE foin.FORM_ID = fiit.FORM_ID
AND foin.CLIENT_ID = trtm.CLIENT_ID
AND fiit.FORM_NUMBER = 607
AND fiit.FORM_ITEM_NUMBER = 3779
AND length(fiit.ANSWER) >= 1
AND trtm.TREATMENTCODE = 'K'
AND trtm.ENDDATE BETWEEN TRUNC(to_date('01/01/2014', 'dd/mm/yyyy'), 'DDD') AND TRUNC(to_date('31/12/2014', 'dd/mm/yyyy'), 'DDD')
AND foin.STARTDATE BETWEEN trtm.STARTDATUM AND NVL(trtm.ENDDATE, to_date('01/01/9999', 'dd/mm/yyyy'))
) inn
WHERE rnk = 1
AND inn.id = client.CLIENT_ID
) form1
FROM treatment trtm, CLIENT client
WHERE trtm.TREATMENTCODE = 'K'
AND client.CLIENT_ID = trtm.CLIENT_ID
AND trtm.ENDDATE BETWEEN TRUNC(to_date('01/01/2014', 'dd/mm/yyyy'), 'DDD') AND TRUNC(to_date('31/12/2014', 'dd/mm/yyyy'), 'DDD')
外部查詢結果175級的客戶誰擁有特定的治療代碼,並在2014年治療結束日期現在爲這些客戶的很多其他的數據是檢索(如姓名,年齡,治療時間)這是不相關的,我現在離開了。然後有大約30個類似的子查詢,從表單中檢索答案。我使用了相關的查詢,因爲要從這些表單中檢索答案,客戶端ID必須是已知的。如果這是子查詢查找數據所需的唯一東西,這不會是一個問題,但還有一個其他要求:檢索的表單必須在治療期內填寫,因爲我無法找到一種方法將這些數據從外部查詢推送到子子查詢,我再次在子查詢中查詢,這導致了速度緩慢。
有一個子查詢和一個子查詢的原因是因爲必須找到表單的第N個排名答案。在我的代碼的以前版本中,我沒有子查詢的where子句中的處理代碼,處理開始和結束日期要求。這導致子子查詢得出例如4個排名爲1,2,3,4的結果,但不一定是在治療期內形成的形式,這是錯誤的。
所以加上幾行:
AND trtm.TREATMENTCODE = 'K'
AND trtm.ENDDATE BETWEEN TRUNC(to_date('01/01/2014', 'dd/mm/yyyy'), 'DDD')
AND TRUNC(to_date('31/12/2014', 'dd/mm/yyyy'), 'DDD')
AND foin.STARTDATE BETWEEN trtm.STARTDATUM AND NVL(trtm.ENDDATE, to_date('01/01/9999', 'dd/mm/yyyy'))
導致查詢是正確的,它以前是不完全正確的。他們還導致查詢需要幾個小時,而不是約175個行的40秒。
我現在的問題是,我如何重寫這個查詢,使其更快?我將Oracle 11.2.40與Toad Data Point 3.5結合使用,但不幸的是我看不到解釋計劃。
您最好打賭的是在您的查詢上運行EXPLAIN PLAN,並查看查詢的執行方式以及它正在使用的索引或可以使用的索引。 – thedoctor 2015-02-24 11:52:45
我只對數據庫有SELECT權限(以及更新某些表的權限),爲了啓用Toad中的解釋計劃功能,您需要創建一個新表,對吧? – Benjamin 2015-02-24 11:58:11
是的,也許你可以要求dba爲你運行解釋計劃。 – thedoctor 2015-02-24 12:00:52