3 回答

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

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