db2巢狀查詢效率 SQL優化 子查詢與關聯查詢

2021-10-14 00:07:46 字數 2081 閱讀 8539

子查詢就是查詢中又巢狀的查詢,表連線都可以用子查詢,但不是所有子查詢都能用表連線替換,子查詢比較靈活,方便,形式多樣,適合用於作為查詢的篩選條件,而表連線更適合與檢視多表的資料。

子查詢不一定需要兩個表有關聯字段,而連線查詢必須有欄位關聯(所謂的主外來鍵關係)

表關聯的效率要高於子查詢,因為子查詢走的是笛卡爾積

表關聯可能有多條記錄,子查詢只有一條記錄,如果需要唯一的列,最好走子查詢

對於資料量多的肯定是用連線查詢快些,原因:因為子查詢會多次遍歷所有的資料(視你的子查詢的層次而定),而連線查詢只會遍歷一次。

但是資料量少的話也就無所謂是連線查詢還是子查詢,視自己的習慣而定。一般情況下還是用子查詢來的好,容易控制

mysql從4.1版本開始支援子查詢,使用子查詢進行select語句巢狀查詢,可以一次完成很多邏輯上需要多個步驟才能完成的sql操作。子查詢雖然很靈活,但是執行效率並不高。

那麼問題來了,什麼是子查詢?為什麼它的效率不高?

子查詢:把內層查詢結果當作外層查詢的比較條件

示例:select goods_id,goods_name

from goods

where goods_id = (select max(goods_id)

from goods);

執行子查詢時,mysql需要建立臨時表,查詢完畢後再刪除這些臨時表,所以,子查詢的速度會受到一定的影響,這裡多了乙個建立和銷毀臨時表的過程。

優化方式:

可以使用連線查詢(join)代替子查詢,連線查詢不需要建立臨時表,因此其速度比子查詢快。

子查詢和關聯查詢的效率問題

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,否則查詢結果會完全超乎我們的想象,造成不必要的麻煩。

db2巢狀查詢效率 DB2資料庫SQL優化方法一列

optimize for 子句宣告只想檢索部分結果或者優先檢索前幾行,優化器可以選擇能夠將檢索前幾行所需的響應時間縮至最短的訪問方案。此外,作為單個塊傳送到客戶機的行數由 n 的值限制。因此,optimize for 子句既影響伺服器從資料庫檢索合格行的方式,又影響將那些行返回給客戶機的方式.例如,...

DB2巢狀游標

p1 begin declare v did varchar 10 declare v dname varchar 10 declare v tid varchar 10 declare v tname varchar 10 declare i seq integer default 0 decla...

DB2利用db2advis進行查詢優化

一 登陸db2 su db2inst1db2 connect to 資料庫名 user 使用者名稱using密碼 二 建立sql檔案 cd mkdir p test cd test vi test.sql test.sql select name,age,from select from selec...