优化SQL查询 - 连接4个表

时间:2016-06-15 08:38:42

标签: sql sql-server tsql join optimization

我正在尝试加入4个表格。目前我通过这样做实现了它。

    SELECT columns
    FROM tableA
    LEFT OUTER JOIN tableB ON tableB.address_id = tableA.address_id
    INNER JOIN tableC ON  tableC.company_id = tableA.company_id AND tableC.client_id = ?
    UNION
    SELECT columns
    FROM tableA
    LEFT OUTER JOIN tableB ON tableB.address_id = tableA.gaddress_id
    INNER JOIN tableD ON tableD.company_id = tableA.company_id AND tableD.branch_id = ?       

tableC和tableD的结构非常相似。让我们说tableC包含客户端的数据。 tableD包含客户端分支的数据。 tableA是公司,tableB是地址我的目标是从tableA获取数据,这些数据连接到表B(所有具有地址的公司)以及来自tableD和tableC的所有数据。

这很好,但我担心这会很慢。

3 个答案:

答案 0 :(得分:4)

我认为你可以像这样欺骗它:

UNIONC之间的第一个D以及仅与查询其余部分的联接,它应该显着改进查询:

SELECT columns
FROM TableA
LEFT OUTER JOIN tableB ON tableB.address_id = tableA.address_id
INNER JOIN(SELECT Columns,'1' as ind_where FROM tableC
           UNION ALL
           SELECT Columns,'2' FROM TableD) joined_Table
 ON  (joined_Table.company_id = tableA.company_id AND joined_Table.New_Col_ID= ?)

New_Col_ID - >只需在同一列中同时选择branch_idclient_id,并将其别名为New_Col_ID或其他任何内容

此外,您可以索引表格(如果尚未存在):

TableA(address_id,company_id)
TableB(address_id)
TableC(company_id,client_id)
TableD(company_id,branch_id)

答案 1 :(得分:0)

为什么这会慢?您选择客户端地址和分支地址并显示完整的结果。这似乎是直截了当的。

您加入ID并且这应该很快(因为应该有相应的索引)。您可能想在

上引入复合索引
create index idx_c on tableC(client_id, company_id)

create index idx_d on tableD(branch_id, company_id)

然而:UNION对于DBMS来说是很多工作,因为它必须寻找并消除重复。甚至可以有吗?否则使用UNION ALL

答案 2 :(得分:0)

尝试使用CTE,这样你就不必经过两次TableA和TableB来进行联合。

; WITH TempTable (Column1, Column2, ...)
    AS (    SELECT columns
            FROM tableA
            LEFT OUTER JOIN tableB
                 ON tableB.address_id = tableA.gaddress_id
        )
SELECT Columns
FROM    TempTable
INNER JOIN tableC 
    ON  tableC.company_id = tableA.company_id AND tableC.client_id = ?
UNION
SELECT Columns
FROM    TempTable
INNER JOIN tableD ON tableD.company_id = tableA.company_id AND tableD.branch_id = ?