【问题标题】:SQL Alternative to left outer join左外连接的 SQL 替代方案
【发布时间】:2016-11-17 05:47:01
【问题描述】:

在性能方面,这是 LEFT OUTER JOIN 的一个很好的替代方案吗?是最好的吗?

 SELECT a.PRODUCT_ID
    ,a.PROD_NAME
    ,a.PRODUCTTYPE_ID
    ,a.SUPPLIER_ID
    ,t.PRODTYPE_NAME
    ,s."NAME" SUPPLIER_NAME
FROM PRODUCT a
INNER JOIN (
    SELECT NULL PRODUCTTYPE_ID
        ,NULL PRODTYPE_NAME
    FROM rdb$database

    UNION ALL

    SELECT PRODUCTTYPE_ID
        ,PRODTYPE_NAME
    FROM PRODUCTTYPE
    ) t
    ON (t.PRODUCTTYPE_ID = a.PRODUCTTYPE_ID) OR (t.PRODUCTTYPE_ID IS NULL AND a.PRODUCTTYPE_ID IS NULL)
INNER JOIN (
    SELECT NULL SUPPLIER_ID
        ,NULL "NAME"
    FROM rdb$database

    UNION ALL

    SELECT SUPPLIER_ID
        ,"NAME"
    FROM SUPPLIER
    ) s
    ON (s.SUPPLIER_ID = a.SUPPLIER_ID) OR (s.SUPPLIER_ID IS NULL AND a.SUPPLIER_ID IS NULL)

根据主键和外键对表 PRODUCT 及其各自表中的 PRODUCT_ID、PRODUCTTYPE_ID、SUPPLIER_ID 进行索引

【问题讨论】:

  • 你能发布使用左外连接的替代查询吗?您是否尝试过运行任何性能计时或查看查询的执行计划?
  • 为什么你需要一个旧的left join 的替代品?你有某种性能问题吗?你有理由相信left join是原因吗?
  • 键并不总是创建索引(取决于 dbms 等),它们创建的任何索引都可能不适合您正在执行的查询。工会通常不是一个好的选择。需要更多地了解您遇到的问题。不过,我更精通 sql server。
  • 我不明白——您显示的查询是非左连接吗?一定是因为它使用了内连接。
  • 我在这里可能会因为过度概括而感到内疚。实际上,我在系统中有另一个声明是我真正关心的,但有相同的一般声明。

标签: sql firebird


【解决方案1】:

不!

您应该使用left join。以下是您的方法(几乎很可能)会变得更糟的一些原因:

  • 您正在执行多个连接而不是单个连接。单个连接应该更快。
  • 您在on 子句中有or。哦!这是一个性能杀手。
  • 使用union all 在连接之前使用索引变得更加困难。而且统计数据可能会关闭(虽然我不知道 Firebird 是否使用统计数据来优化查询)。
  • 您的复杂查询不太可能使用索引。

一个简单的left join 应该使用索引并且具有更好的性能。

【讨论】:

    【解决方案2】:

    如果以下查询将为您提供与您展示的相同的功能,请改用它

    SELECT a.PRODUCT_ID, a.PROD_NAME, a.PRODUCTTYPE_ID, a.SUPPLIER_ID , 
           t.PRODTYPE_NAME, s."NAME" SUPPLIER_NAME 
    FROM PRODUCT a
    left join PRODUCTTYPE P ON P.PRODUCTTYPE_ID=a.PRODUCTTYPE_ID 
    left join SUPPLIER S ON s.SUPPLIER_ID=a.SUPPLIER_ID
    

    你可以看到你没有联合(甚至你应该使用的 UNION ALL)——所以这会更快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多