2016-11-16 91 views
0

這是一個很好的替代LEFT OUTER JOIN,性能明智嗎?這是最好的嗎?SQL替代左外部連接

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_ID,PRODUCTTYPE_ID,SUPPLIER_ID表產品和它們各自的表憑藉主鍵和外鍵的

+1

你可以發佈利用左外連接的替代查詢嗎?您是否嘗試過運行任何性能計時或查看查詢的執行計劃? – Aron

+1

爲什麼你需要一個好的舊'左連接'的替代品?你有什麼樣的性能問題?你有理由相信「左連接」是原因嗎? – Blorgbeard

+0

鍵並不總是創建索引(取決於諸如dbms等之類的東西),並且它們創建的任何索引可能對您正在執行的查詢都不利。工會通常不是一個好的選擇。需要更多地瞭解您遇到的問題。不過,我更熟悉SQL Server。 – Nikki9696

回答

3

沒有!您可以使用left join。以下是你的方法(幾乎所有可能性)會變得更糟的一些原因:

  • 你正在做多個連接而不是單個連接。單個連接應該更快。
  • 您在on條款中有or。 Oy公司!這是一個性能殺手。
  • 使用union all之前連接使得使用索引要困難得多。統計信息可能會關閉(雖然我不知道Firebird是否使用統計信息來優化查詢)。
  • 您的複雜查詢不太可能使用索引。

一個簡單的left join應該使用索引,並有更好的性能。

0

如果下面的查詢會給你相同的功能的一個告訴你,然後用它代替

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,您應該使用) - 所以這會更快。