SQL資料庫使用JOIN的優化方法

2021-04-13 21:30:26 字數 2079 閱讀 6910

很早以前,也是一提到sql server,就覺得它的效能沒法跟oracle相比,一提到大資料處理就想到oracle。自己一路走來,在本地blog上記錄了很多優化方面的 post,對的錯的都有,沒有時間系列的整理出來,這篇文章將join方法的概念稍微整理在一起,給大家個參考。通過查資料了解裡面提到的各種概念,在實 際中不斷驗證總結,完全可以對資料庫一步步深入理解下去的。

我只對sql server 2000比較了解,但這並不阻礙我在oracle、mysql進行sql調優、產品架構,因為在資料庫理論原理上,各大資料庫基本出入不大,對資料庫的深入理解,也不會影響你架構設計思想變壞,相反給你帶來的是更深層次的思考。

關於執行計畫的說明

在sql server查詢分析器的query選單中選擇show execution plan,執行sql查詢語句,在結果視窗中有grid、execution plan、messages三個tab。看圖形形式的執行計畫,順序是從右到左,這也是執行的順序。執行計畫中的每乙個圖示表示乙個操作,每乙個操作都會 有乙個或多個輸入,也會有乙個或多個輸出。輸入和輸出,有可能是乙個物理資料表、索引資料結構,或者是執行過程中的一些中間結果集/資料結構。滑鼠移動到 圖示上,會顯示這個操作的具體資訊,例如邏輯和物理操作名稱、記錄的數量和大小、i/o成本、cpu成本、操作的具體表示式(引數argument)。鼠 標移動到連線箭頭上,會顯示箭頭起始端的操作輸出結果集的記錄數、記錄的大小,一般情況下可以將這個輸出結果集理解為箭頭結束端的輸入。

另 外關於執行計畫的一些補充說明:1. 執行計畫中顯示的資訊,都是乙個「評估」的結果,不是100%準確的資訊,例如記錄數量是取自統計資訊,i/o成本、cpu成本來自執行計畫生成過程中基 於統計資訊等得出的評估結果。2. 執行計畫不一定準確,一方面受sql server維護的統計資訊準確性的影響,另一方面sql語句編譯時刻與執行時刻的環境(記憶體使用狀況、cpu狀況等)可能會不一樣。

關於統計資訊、i/o成本和cpu成本的評估、sql語句的編譯和執行過程,這裡不再深入。另外儘管執行計畫不一定準確,但它仍是sql語句分析最重要的依據,因為你可以理解為,絕大部分情況下,sql server是以這種方式來執行的。

join方法說明

資料庫中,象tablea inner join tableb、tablea left out join tableb這樣的sql語句是如何執行join操作的?就是說sql server使用什麼演算法實現兩個表資料的join操作?

sql server 2000有三種方式:nested loop、merge、hash。oracle也是使用這三種方式,不過oracle選擇使用nested loop的條件跟sql server有點差別,記憶體管理機制跟sql server不一樣,因此檢視執行計畫,oracle中nested loop運用非常多,而merge和hash方式相對較少,sql server中,merge跟hash方式則是非常普遍。

以sql server 2000為例對這三種方式進行說明,穿插在裡面講解執行計畫的一些初級使用。

1. nested loop join

1.1 示例sql

select ... from tablea inner join tableb on tablea.col1=tableb.col1 where tablea.col2=? and tableb.col2=?tablea中沒有建立任何索引,tableb中在col1上有建立乙個主鍵(聚集索引)。

1.2 演算法偽**描述

foreach rowa in tablea where tablea.col2=?

join操作有兩個輸入,上面例子中tablea是outer input,用於外層迴圈;tableb是inner input,用於迴圈內部。下面針對執行計畫描述一下sql server完成這個操作的具體步驟。 %. ^ g.l

2vt [ ahva

1.3 檢視執行計畫方法

移到文章最前面。

1.4 執行步驟

下 面是示例sql的執行計畫圖。 nested loop操作的右邊,位於上面的是outer input,位於下面的是inner input。你不能夠根據join中哪個表出現在前面來確定outer input和inner input關係,而必須從執行計畫中來確定,因為sql server會自動選擇哪個作為inner input。 

SQL資料庫使用JOIN的優化方法

很早以前,也是一提到sql server,就覺得它的效能沒法跟oracle相比,一提到大資料處理就想到oracle。自己一路走來,在本地blog上記錄了很多優化方面的 post,對的錯的都有,沒有時間系列的整理出來,這篇文章將join方法的概念稍微整理在一起,給大家個參考。通過查資料了解裡面提到的各...

資料庫 Join語句優化

關聯查詢的演算法 nested loop join 演算法 block nested loop join 演算法 nested loop join 演算法 乙個簡單的 nested loop join nlj 演算法一次一行迴圈地從第一張表 稱為驅動表 中讀取行,在這行資料中取到關聯字段,根據關聯欄...

Sql 資料庫 join 連線

sql裡面有兩個連線乙個是union,另乙個就是join 他們兩個的區別 union 連線的是行 是一行一行的連 而 join 連線的是列 字段 他們倆的區別暫時就就知道這點 join連線的使用的前提 1.必須要有至少乙個表 乙個表可以用自連線 2.必須要有相關聯的列 字段 主鍵外來鍵啥的。join...