【问题标题】:JOIN ... WHERE vs. CASE WHEN for optimizing filters?JOIN ... WHERE 与 CASE WHEN 优化过滤器?
【发布时间】:2022-12-06 02:53:16
【问题描述】:

在过滤大型表时,执行自连接与 case 表达式之间是否存在性能差异?例如,我有一个姓名和职业列表,我想创建一个只有当某人是医生时才填充的列。

我通过两种方式做到了这一点:

  1. 案例
    select name
    , case 
        when profession = 'doctor' 
          then profession 
        else null 
      end as is_doctor
    from professions
    
    1. 左连接...在哪里
    select name
    , is_doctor
    from professions
      left join (
        select name
        , profession 
        from professions 
        where profession = 'doctor'
      ) d on professions.name = d.name
    

    我知道 WHERE 往往比 CASE WHEN 成本更低,但 LEFT JOIN 可能会使它变慢。第一个更具可读性,但我想知道第二个是否更有效率。

【问题讨论】:

  • 为什么不用数据自己测试一下,但是恕我直言
  • 只有高端数据库引擎才能确定第二个查询等同于第一个查询(便宜得多)。典型的数据库(SQL Server、MySQL、Sybase 等)将无法优化第二个,而且它们会慢得多。

标签: sql postgresql


【解决方案1】:

我不知道你从哪里得到 CASE 很慢的想法。没有连接的第一个查询必然至少与第二个查询一样好。

【讨论】:

    【解决方案2】:
    select name
    , case 
        when profession = 'doctor' 
          then profession 
      end as is_doctor
    from professions
    

    ...可能更容易维护。因此,就开发人员时间而言,它要快得多。

    假设这是您实际的复杂 SQL 查询的一个微不足道的例子——在这里和那里减少几毫秒确实很重要——您将希望对您的大型数据集使用复杂的 SQL 来执行您自己的查询测试。

    【讨论】:

      猜你喜欢
      • 2012-04-02
      • 2022-05-05
      • 1970-01-01
      • 1970-01-01
      • 2021-03-15
      • 1970-01-01
      • 2016-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多