子查詢和關聯查詢 效率

2021-06-02 21:38:04 字數 1293 閱讀 4989

msdn對子查詢的定義是這樣的:

可以將乙個查詢的結果用作另乙個查詢的輸入。可以將子查詢的結果用作使用 in( ) 函式、exists 運算子或 from 子句的語句。

一條好的值得稱讚的規則是盡量用連線代替所有的子查詢。優化器有時可以自動將子查詢「扁平化」,並且用常規或外連線代替。但那樣也不總是有效。明確的連線對選擇表的順序和找到最可能的計畫給出了更多的選項。當你優化乙個特殊查詢時,了解一下是否去掉自查詢可產生很大的差異。這段話出自它顯然告訴我們在查詢的時候最好不要用子查詢,當時我並不太在意,至到我有一次遇到了這樣的情況。  

現在的**主要的壓力都來自於資料庫,頻繁的資料庫訪問經常會使伺服器宕機。我的原則就是儘量減少資料庫的連線,能一次性取出的決不多連線資料庫一次,但是有時候並不完全是這樣。鬱悶,無解。

下面一條sql語句裡面有乙個子查詢,info.resource_volumecount

,它是指乙個電影共有多少集.這個欄位是int型別的.子查詢的目的就是計算出乙個電影在資源表中總共有多少集(實際存在的), 兩者做減法操作就可以計算出這個電影共缺多少集(lastcount)我們知道在這條語句執行的時候,外層記錄查詢一次在計算lastcount欄位的時候又要查詢表:電影表

一次.如果最外層有10條記錄,那麼執行這次查詢一共要掃瞄電影表

11次,連線資料庫1次.

基於有的朋友看不明白我寫的sql語句,可能是因為我寫的有些欄位和本案例沒有太大關係的原因,現在特將它們做乙個替換.

經過個人實踐,證明子查詢效率特別低,而一般的子查詢都可以由關連查詢來實現相同的功能,關聯查詢的效率要提高很多,所以建議在資料查詢時避免使用子查詢(尤其是在記錄很多時),而最好用關聯查詢來實現。

現在舉例說明。

子查詢sql語句:select  lo,la  from  track where lid in (select lid from line where lname like '%lname%');

關聯查詢sql語句:select lo,la from track,line where line.lname like  '%lname%' and line.lid=track.lid;

子查詢執行時間為5分48秒;而關聯查詢耗時不足一秒。事實勝於雄辯,關聯查詢的優勢不言而喻。

在關聯查詢時要注意:where子句中一定要包含表之間的連線條件,如 line.lid=track.lid,否則查詢結果會完全超乎我們的想象,造成不必要的麻煩。   

子查詢和關聯查詢的區別

子查詢就是查詢中又巢狀的查詢,表連線都可以用子查詢,但不是所有子查詢都能用表連線替換,子查詢比較靈活,方便,形式多樣,適合用於作為查詢的篩選條件,而表連線更適合與檢視多表的資料。子查詢不一定需要兩個表有關聯字段,而連線查詢必須有欄位關聯 所謂的主外來鍵關係 1,表關聯的效率要高於子查詢,因為子查詢走...

27 關聯查詢 聯合查詢 子查詢

select 欄位名 from 表1,表2 on 關聯條件 顯示前3條 limit 0,3 找出比部門平均工資高的員工編號,基本工資 select t employee.eid,basic salary from t salary inner join t employee inner join s...

子查詢快 還是關聯查詢快 SQL關聯子查詢

關聯子查詢,根本含義就是對於外部查詢返回的每一行資料,內部查詢都要執行一次,就像python裡邊說的遍歷一樣。遍歷後對符合條件的記錄進行操作。題目 查詢每門課程的成績第2名到第3名的學生資訊及該課程成績 selectwhere跟的條件的含義 查詢同乙個課程sc表的成績小於sc1表的總人數。子查詢中 ...