我嘗試瞭解如何使用大量JOIN子句更正寫入大型查詢。 這個查詢具有相同的性能嗎?如何使用LEFT JOIN編寫查詢以獲得更高性能
/*Sql 1*/
SELECT G.ID, T1.QUANTITY, T2.QUANTITY
FROM GOODS G
LEFT JOIN
/*First subquery*/
(SELECT SUM(QUANTITY) QUANTITY, GOOD_ID
FROM MY_TABLE_1
GROUP BY GOOD_ID
) T1 ON G.ID = T1.GOOD_ID
LEFT JOIN
/*Second subquery*/
(SELECT SUM(QUANTITY) QUANTITY, GOOD_ID
GROUP BY GOOD_ID
FROM MY_TABLE_2
) T2 ON G.ID = T2.GOOD_ID
/*and so on....Next same subqueries*/
WHERE G.ID IN (1, 2, 3, 4);
在相同的下一個查詢的WHERE子句中的所有連接子查詢和外LEFT JOIN子句在內CLAUSE更換設置。這是一個好的解決方案嗎?還是oracle優化器自動做出這樣的事情?
/*Sql 2*/
SELECT G.ID, T1.QUANTITY, T2.QUANTITY
FROM GOODS G
INNER JOIN
/*First subquery*/
(SELECT SUM(QUANTITY) QUANTITY, GOOD_ID
FROM GOODS G
LEFT JOIN MY_TABLE_1 M ON M.GOOD_ID = G.ID
WHERE G.ID IN (1, 2, 3, 4);
GROUP BY GOOD_ID
) T1 ON G.ID = T1.GOOD_ID
INNER JOIN
/*Second subquery*/
(SELECT SUM(QUANTITY) QUANTITY, GOOD_ID
FROM GOODS G
LEFT JOIN MY_TABLE_2 M ON M.GOOD_ID = G.ID
WHERE G.ID IN (1, 2, 3, 4);
GROUP BY GOOD_ID
) T2 ON G.ID = T2.GOOD_ID
/*and so on....Next same subqueries*/
WHERE G.ID IN (1, 2, 3, 4);
你寫之前,「這是絕對不真實OUTER連接速度比INNER連接速度快「,然後」..嘗試轉換查詢以使用更多的OUTER連接..「。那麼什麼是好的做法 - 使用LEFT OUTER JOIN還是嘗試在INNER JOIN上替換它? – user1881712
我同意內部連接要好得多。外連接意味着Oracle必須在每一行上創建行。沒有任何術語的「JOIN」意味着「INNER JOIN」。只有在需要時才使用OUTER JOIN,因爲如果沒有匹配的數據,則需要空白值。否則,請使用INNER JOIN – AngelWarrior
使用OUTER和INNER聯接應該幾乎完全取決於所討論的表之間的關係,以及您試圖從這種關係中提取的數據類型。我通常對INNER連接有一點偏好,因爲它們可能會導致較少的中間IO,但是您必須根據自己的經驗和對數據的理解來指導您。 – Curt