SQL 查询优化:在事实表中两次使用相同指标的最佳方法是啥?

Posted

技术标签:

【中文标题】SQL 查询优化:在事实表中两次使用相同指标的最佳方法是啥?【英文标题】:SQL Query Optimization: what is the best approach to use same metric twice in the fact table?SQL 查询优化:在事实表中两次使用相同指标的最佳方法是什么? 【发布时间】:2020-02-26 18:19:14 【问题描述】:

我有一个包含业务部门和员工姓名的维度表,如下所示。

桌子:暗淡

  business  |  emp_name 
 -----------|----------- 
  sales     |  A        
  sales     |  B        
  marketing |  C        
  product   |  D        
  IT        |  E     

还有一个包含员工之间交易的事实表,如下所示。表: fct

  client_emp_name |  provider_emp_name |  value 
 -----------------|--------------------|-------- 
  A               |  C                 |     10 
  C               |  D                 |      5 
  C               |  B                 |     10 

我想编写一个查询来查找每个业务作为客户和提供商的值总和(包括没有交易的业务单位)期望结果

  business  |  provider_total_value |  client_total_value 
 -----------|-----------------------|--------------------- 
  sales     |                    10 |                  10 
  marketing |                    15 |                   0 
  product   |                     0 |                   5 
  IT        |                     0 |                   0 

对于这种情况,构建 SQL 查询的最佳方式是什么?我有以下查询可以提供准确的结果,但我不确定它是否是解决此问题的最佳方法。

With provider as (
    SELECT
        d.business,
        SUM(f.value) as provider_total_value
    FROM fct as f
        right join  dimension as d on d.emp_name = f.provider_emp_name 
    Group by 1
),

client as (
    SELECT
        d.business,
        SUM(f.value) as client_total_value
    FROM fct as f
        right join  dimension as d on d.emp_name = f.client_emp_name 
    Group by 1
)


Select
    p.business,
    COALESCE(p.provider_total_value, 0) as provider_total_value,
    COALESCE(c.client_total_value, 0) as client_total_value
From provider as p
Inner join client as c on c.business = p.business

谢谢!

【问题讨论】:

在第二个查询中你没有做任何操作。 只有一个带有 CTE 的查询。 【参考方案1】:

您能否也为 trades 表提供架构?

我认为您编写的查询是有效的。为了进一步改进,我会为主键(业务)使用整数数据类型,而不是字符/字符串数据类型。

【讨论】:

感谢您的回复,有一个错字,我编辑了它。两个内部查询都转到 fct 表 嗨@yl3441,如果答案有用,请您点赞吗?

以上是关于SQL 查询优化:在事实表中两次使用相同指标的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

停止 SQL 在 JOIN 中两次返回相同的结果

在php中两次调用相同的函数时出错

spring+mybatis中两次相同条件查询时 session一级缓存与数据库隔离级别需要注意的点

oracle 两表中两列模糊查询,具体例子如下:

查询成本是 MySQL 查询优化的最佳指标吗?

Spark:在查询中两次使用临时表?