SQL調優之三 執行計畫的連線方式

2022-09-06 22:45:27 字數 1398 閱讀 7674

連線是指在sql的where或者from後面跟著多個行源(表,檢視,或者資料集等)的時候,資料庫對這些行源進行聯合的操作。連線的條件則是資料庫要來判斷不同資料集之間關係的依據,如果沒有提供正確的關聯關係,那麼資料庫就會對資料集做笛卡爾連線,把內錶(n行)和外表(m行)的每一行資料進行匹配,結果集是n*m行。

一次join的操作有以下4個部分:

對於簡單的語句來說,優化器必須決定以什麼方式來獲取資料,比如說通過索引,還是全表掃瞄。索引是範圍掃瞄,跳躍範圍掃瞄,還是唯一掃瞄。

把每一對行集給連線起來的方式,就是join methods。比如說巢狀迴圈連線,雜湊連線,排序合併連線。笛卡爾連線必須依賴其中一種連線方式。

連線的條件決定連線的型別。比如說內部連線,只返回匹配條件的行源。外連線則會獲取不匹配條件的資料。

在執行一條需要連線超過兩個表的語句,oracle會先連線其中的而兩個表,然後將連線的結果集,再和下乙個表連線,一直到所有的表都連線完成。

oracle在決定連線的順序和連線方式的時候,目標是盡早減少資料集的行數(基本方針),這樣子sql在執行過程中的工作量就會少一點。

在這個過程中,優化器會根據可能的連線順序,連線方式以及access path來生成乙個執行計畫的集合。然後再對這群執行計畫進行成本估算,最後選擇乙個成本最低的執行計畫。

當選擇執行計畫的時候,優化器會考慮以下因素:

ps: 

anti join, 反連線,是指返回不匹配右側的子查詢的行集的連線方式。比方說列出沒有員工的部門,結構是not exists或者not in

semi join, 半連線,是指返回第乙個表裡面至少在第二個表裡能匹配到一次的資料行。比如說列出至少有乙個員工的部門。和常規的連線不同的地方在於,第乙個表裡的行最多被返回一次。半連線使用的結構是exists或者in

優化器通過預估的i/o和cpu來計算成本,其中無論是i/o或者cpu都有一些相關的度量值。比如說i/o會分單塊讀或者多塊讀。cpu則會因為不同的函式或者表示式而不同。

因此,常見的三種連線方式在成本估算上的主要影響因素也不同:

另外,這些過程中的度量值也會受很多初始化引數或者編譯時的會話設定所影響,比如說db_file_multi_block_read_count的設定,系統統計資訊等等。

連線方式是指兩個資料集之間連線的機制,在生成執行計畫的過程中,資料庫會基於統計資訊,選擇乙個預估成本最低的方式。

我們所熟悉的巢狀迴圈連線(nested loops),雜湊連線(hash join),以及排序合併連線(sort merge),就是連線方式。

每個連線方式都會有兩個子部分,乙個是驅動表(外部表),另乙個則是被驅動表(內部表),注意的是,雖然習慣性說是「表」,實際上應該說是資料集。

使用plsql執行計畫進行sql調優

一段sql 寫好以後,可以通過檢視sql的執行計畫,初步 該sql在執行時的效能好壞,尤其是在發現某個sql語句的效率較差時,我們可以通過檢視執行計畫,分析出該sql 的問題所在。1 開啟熟悉的檢視工具 pl sql developer。在pl sql developer中寫好一段sql 後,按f5...

效能調優5 執行計畫

查詢優化器基於當前的統計資訊和引數,衡量開銷之後,選擇 最優 的執行計畫,需要注意的是,最優 是相對的,優化器不可能窮舉所有的執行計畫來評估其開銷,這個 最優 的標準是對當前引數和當前的統計資訊來說的,優化器從生成的備選執行計畫中選擇開銷最小的。由於執行計畫的編譯和生成是很耗費資源和時間的,因此,s...

sql的效能調優

週末火速趕到了客戶現場,週六開始幹活,查詢程式效能差的原因。經過分析,有一些還是我們需要注意總結的。如 com 元件的預設事務隔離級別,在大併發下面,是乙個很大的瓶頸。asp.net對於sp的呼叫,事務是否正常使用,也是乙個很大的瓶頸。但是對於pssdiag分析出來的結果,我還不知道應該怎麼用?只能...