查询使用案例在左外连接中需要很长时间才能运行

发布于 2025-02-11 09:01:26 字数 1176 浏览 2 评论 0原文

我正在使用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

I am running a Postgres query with a CASE expression in a join condition. The query takes a long time to run. Is there a better way to optimize this query?

Code snippet:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

白首有我共你 2025-02-18 09:01:26

为了适当答案,请附上完整的查询,表格结构(带有索引)和执行计划。

原始案例非常复杂,但是很难说是否负责查询性能,而没有执行计划中的信息。

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表中)是加入的关键

For proper answer attach full query, table structure (with indexes) and execution plan.

Original CASE is quite complicated, but hard to say if it's responsible for query performance without information from execution plan.

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

This case can be transformed to

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

or even

da.unique_key = coalesce (fo.dimension__first_report__primary_releasing_actor_key ,fo.dimension__first_dictation__dictating_actor_key)

This should give a optimizer (and everybody else) better understanding which column (in da table) is key for joining

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文