我正在使用CASE連接條件中的運算式運行 Postgres 查詢。查詢需要很長時間才能運行。有沒有更好的方法來優化這個查詢?
代碼片段:
LEFT OUTER JOIN analyticsdatamart_gen_nontemporal_v1.dimension_organisations org ON org.unique_key = fo.dimension__order__responsible_organisation_key
LEFT OUTER JOIN analyticsdatamart_gen_nontemporal_v1.dimension_work_sites site ON site.unique_key = fo.dimension__order__responsible_work_site_key LEFT OUTER JOIN analyticsdatamart_gen_nontemporal_v1.dimension_priorities prio ON fo.dimension__maximum_priority_procedure__priority_key = prio.unique_key LEFT OUTER JOIN analyticsdatamart_gen_nontemporal_v1.dimension_actors da
ON CASE
WHEN da.unique_key = fo.dimension__first_report__primary_releasing_actor_key IS NOT NULL
THEN da.unique_key = fo.dimension__first_report__primary_releasing_actor_key
ELSE da.unique_key = fo.dimension__first_dictation__dictating_actor_key
END
LEFT OUTER JOIN analyticsdatamart_gen_nontemporal_v1.fact_series fse ON fse.dimension__study__key = st.unique_key
LEFT OUTER JOIN analyticsdatamart_gen_nontemporal_v1.dimension_series dse ON dse.unique_key = fse.dimension__series__key
uj5u.com熱心網友回復:
要獲得正確答案,請附上完整的查詢、表結構(帶索引)和執行計劃。
原始CASE是相當復雜的,但是如果沒有來自執行計劃的資訊,很難說它是否負責查詢性能。
CASE
WHEN da.unique_key = fo.dimension__first_report__primary_releasing_actor_key IS NOT NULL
THEN da.unique_key = fo.dimension__first_report__primary_releasing_actor_key
ELSE da.unique_key = fo.dimension__first_dictation__dictating_actor_key
END
這種情況可以轉化為
da.unique_key =
CASE WHEN da.unique_key = fo.dimension__first_report__primary_releasing_actor_key IS NOT NULL
THEN fo.dimension__first_report__primary_releasing_actor_key
ELSE fo.dimension__first_dictation__dictating_actor_key
END
甚至
da.unique_key = coalesce (fo.dimension__first_report__primary_releasing_actor_key ,fo.dimension__first_dictation__dictating_actor_key)
這應該讓優化器(以及其他所有人)更好地理解哪一列(在 da 表中)是加入的關鍵
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/497550.html
