SQL Server數(shù)據(jù)庫(kù)沒有JOIN條件導(dǎo)致笛卡爾乘積
作者:suixufeng
在SQL查詢中,如果對(duì)兩張表JOIN查詢而沒有JOIN條件時(shí),就會(huì)產(chǎn)生笛卡爾乘積,從而導(dǎo)致SQL性能下降。本文我們主要就介紹了這一過(guò)程的一個(gè)案例,希望能夠?qū)δ兴鶐椭?/div>
在SQL Server數(shù)據(jù)庫(kù)中,我們常常用到JOIN條件來(lái)對(duì)數(shù)據(jù)庫(kù)進(jìn)行連接查詢,需要注意的一個(gè)問(wèn)題就是沒有JOIN條件會(huì)導(dǎo)致的笛卡爾乘積的問(wèn)題。學(xué)過(guò)線性代數(shù)的人都知道,笛卡爾乘積通俗的說(shuō),就是兩個(gè)集合中的每一個(gè)成員,都與對(duì)方集合中的任意一個(gè)成員有關(guān)聯(lián)??梢韵胂螅赟QL查詢中,如果對(duì)兩張表JOIN查詢而沒有JOIN條件時(shí),就會(huì)產(chǎn)生笛卡爾乘積。這就是我們的笛卡爾乘積導(dǎo)致的性能問(wèn)題中最常見的案例:開發(fā)人員在寫代碼時(shí)遺漏了JOIN條件。
發(fā)生笛卡爾乘積的sql:
- select sum(project_fj.danjia*project_fj.mianji) from project_fj,orderform
- where project_fj.zhuangtai='未售' and project_fj.project_id=30
這個(gè)語(yǔ)句其實(shí)只是sql語(yǔ)句的一部分,問(wèn)題是另一部分用到了表orderform,所以from中有orderform,但是上面的這部分語(yǔ)句完全沒有用到orderform,但是不設(shè)置條件就導(dǎo)致了笛卡爾乘積。
解決方法:
使用LEFT JOIN
- select sum(project_fj.danjia*project_fj.mianji) from project_fj LEFT JOIN orderform ON project_fj.id=orderform.project_id
- where project_fj.zhuangtai='未售' and project_fj.project_id=30
以上就是SQL查詢中沒有JOIN條件導(dǎo)致的笛卡爾乘積從而影響性能的一個(gè)案例,本文我們就介紹到這里了,希望本次的介紹能夠給對(duì)您有所收獲!
【編輯推薦】
責(zé)任編輯:趙鵬
來(lái)源:
CSDN博客


相關(guān)推薦




