在左外部联接中使用CASE的查询需要很长时间才能运行



我正在运行一个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表中的)哪一列是加入的关键

最新更新