**:巴士飛揚-技術blog :
昨天晚上和網友討論了乙個關於資料庫聯合查詢的效率的問題.說實話,以前我一直沒怎麼考慮過這個問題,在寫sql時,都沒怎麼考慮,似乎一切都成了習慣,或者已經懶散貫了,但是,網友和我聊起來了,我也就好好考慮起這個問題了,平時不考慮時不知道,真正好好計較一下,才發現還有很多門道.
假設我們有三個表,a表,b表,c表.其資料量分別為100,200,300條記錄.並且假設每次都是完全遍歷所有資料才找到結果(其實一般情況下不會真的需要完全遍歷完才能找到結果),並且假設不考慮索引,當然,就算不排除這些因素,結果比例還是一樣的,只是資料大小上有點不一樣.並且假設每次查詢都查出10個結果.
一般我們的查詢語句是這樣的:
select * from a,b,c where a.id=b.aid and b.id=c.bid那這些的查詢效率大概是怎樣的呢?它相當於先將這三表進行組合,再遍歷查詢,查詢量為100*200*300=600萬.好像很嚇人,這只是1,2,3百的三個表,如果個1,2,3百萬,千萬呢,那是不是很恐怖呢?
那我們應該如何進行優化呢?依我的理解,可以不使用三表聯合查詢,分成多個查詢,過濾大量的資料再進行聯合,這樣的話,再聯合時,就可以大量減少遍歷次數,比如以下方式:
方式1: 將三表聯合分成兩個2表聯合查詢,如:先進行ab聯合查詢,再將結果與c聯合. 這樣查詢遍歷次數為:100*200+10*300 =2.3萬.
類似的sql為: select * from (select * from a, b where a.id = b.aid) as ab, cwhere ab.id=c.bid方式2:先對各表進行過濾,再進行三表聯合,或者2表聯合: 這樣查詢的遍歷次數為:100+200+300+10*10*10=1600.,或者:100+200+300+10*10+10*10=800.
類似的sql為: select * from (select * from a where ...)as a,(select * from b where ....) as b, (select * from c where ....) as cwhere a.id=b.aid and b.id=c.bid根據以上的思考,結果很嚇人,經過對比,發現,結果好恐怖,遍歷次數差別簡直就是.........比比看看:600萬--2.3萬--1600--800,這種比例實在太恐怖了,我不得不對聯合查詢產生了動搖,難道我們為聯合查詢的便利,就付出如此巨大的浪費嗎?我們真的應該重新審視一下,我們平時已經習慣的程式設計習慣,以及那些我們認為理所當然的**.或者: select * from (select * from (select * from a where ...)as a,(select * from b where ....) as b where a.id = b.aid) as ab, (select * from c where ....) as cwhere ab.id=c.bid
當然,以上的計算,有著很多的假定在裡面,實際的結果,在不同的資料量,不同的資料庫,不同的資料面前,都會有很大的差異,但是,不可否認聯合查詢的效率,確實不容樂觀,如果有需要優化資料查詢,特別是大資料量的情況下,很值得思考.
資料庫的聯合查詢
定義 表和表之間的資料以縱向的方式連線在一起 舉個例子 select e1 ename,e1 sal,e2 ename from emp e1 e1 和 e2 是自連線 join emp e2 on e1 mgr e2 empno union select ename,sal,我是最大老闆 from...
資料庫的聯合查詢
定義 表和表之間的資料以縱向的方式連線在一起 舉個例子 select e1 ename,e1 sal,e2 ename from emp e1 e1 和 e2 是自連線 join emp e2 on e1 mgr e2 empno union select ename,sal,我是最大老闆 from...
Access資料庫多表聯合查詢
access 資料庫多表聯合查詢 1 access 資料庫多表聯合查詢,每次連線之前須將連線符前面的內容放在括號裡面,示例如下 select 表a.欄位1,表b.欄位1,表c.欄位1,表d.欄位1 from 表a inner join 表b on 表a.欄位 表b.欄位 inner join 表c ...