我正在运行一个Postgres查询,其中CASE
表达式处于联接条件中。查询运行需要很长时间。是否有更好的方法来优化此查询?
代码片段:
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
要获得正确答案,请附加完整查询、表结构(带索引)和执行计划。
原始的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表中的)哪一列是加入的关键