3 回答

TA貢獻1827條經(jīng)驗 獲得超8個贊
WHERE在某些常見情況下,僅使用過濾聯(lián)接可能效率極低。例如:
SELECT * FROM people p, companies c
WHERE p.companyID = c.id AND p.firstName = 'Daniel'
大多數(shù)數(shù)據(jù)庫將完全按字面意義執(zhí)行此查詢,首先采用和表的笛卡爾積,然后按具有和字段的表進行過濾。盡管完全不受約束的產(chǎn)品并不存在于內(nèi)存中,而是僅存在片刻,但計算確實需要一些時間。peoplecompaniescompanyIDid
更好的方法是JOIN在相關(guān)時將約束與s 組合在一起。這不僅主觀上更容易閱讀,而且效率更高。因此:
SELECT * FROM people p JOIN companies c ON p.companyID = c.id
WHERE p.firstName = 'Daniel'
它稍長一些,但是數(shù)據(jù)庫能夠查看該ON子句并使用它直接計算完全約束JOIN,而不是從所有內(nèi)容開始然后進行限制。這樣可以更快地進行計算(尤其是對于大型數(shù)據(jù)集和/或多表聯(lián)接),并且需要更少的內(nèi)存。
我更改了我看到的每個使用“逗號JOIN”語法的查詢。我認為,其存在的唯一目的是簡潔??紤]到性能影響,我認為這不是一個令人信服的理由。

TA貢獻1868條經(jīng)驗 獲得超4個贊
更詳細的信息INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN
來自ANSI SQL / 92語法以進行連接。對我而言,這種冗長的用法使開發(fā)人員/ DBA可以更清楚地了解聯(lián)接的意圖。
添加回答
舉報