1. 什么是笛卡爾積
1.1 定義
笛卡爾積又叫笛卡爾乘積,是一個叫笛卡爾的人提出來的。
簡單的說就是兩個集合相乘的結果。
具體的定義去看看有關代數系的書的定義。
直觀的說就是
集合A{a1,a2,a3} 集合B{b1,b2}
他們的 笛卡爾積 是 A*B ={(a1,b1),(a1,b2),(a2,b1),(a2,b2),(a3,b1),(a3,b2)}
任意兩個元素結合在一起
笛卡爾(Descartes)乘積又叫直積。假設集合A={a,b},集合B={0,1,2},則兩個集合的笛卡爾積為{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}。可以擴展到多個集合的情況。類似的例子有,如果A表示某學校學生的集合,B表示該學校所有課程的集合,則A與B的笛卡爾積表示所有可能的選課情況。
1.2 SQLL笛卡爾積示例
SELECT * FROM table1 , table2
2. 什么場景會產生笛卡爾積
笛卡爾積產生,有兩種情況:
- 表連接缺少關聯條件,這個是必須要改的;
- 表連接有關聯條件,但是oracle判斷用笛卡爾積更快,也會出現笛卡爾積,這個時候要看實際執行速度;oracle這樣判斷,一般是表比較小,這個時候要特別檢查表的數據量是不是真的很少,以免oracle因為統計信息錯誤而誤判。
3. SQL笛卡爾積的危害
4. 如何避免SQL笛卡爾積
Left join , hint
