PostgreSQL的三種表連線方式簡述

2021-09-30 13:12:53 字數 1001 閱讀 9217

我們知道postgresql有三種表連線方式,分別是巢狀迴圈連線(nestloop join)、雜湊連線(hash join)、排序合併連線(merge join)。

這三種連線方式是如何工作的呢?如果你熟悉oracle的話,應該會發現著三種連線方式與oracle是一樣的。

nestloop join:

巢狀迴圈連線是兩個表在做連線時最樸素的一種連線方式。在巢狀迴圈連線中,內錶被外表驅動,外表返回的每一行都要在內表中檢索並找到與它匹配的行,因此整個查詢返回的結果集不能太大(>10000不合適),要把返回子集較小的表作為外表,而且在內表的連線欄位上要有索引,否則會很慢。

執行過程:加入有兩個表a、b,a小於b,則查詢優化器會先從a表中取出一條數,然後到b中找到匹配的行並放入等待返回的結果集中,然後再從a中取出第二條記錄,繼續到b中匹配,如此迴圈直到找到所有匹配結果並返回。

hash join:

優化器使用兩個表中較小的表,並利用連線鍵在記憶體中建立雜湊表,然後掃瞄較大的表並探測雜湊表,找出與雜湊表匹配的行。

這種方式使用於較小的表可以完全放於記憶體中的情況,這樣總成本就是訪問兩個表的成本之和。但是如果表很大不能完全放入記憶體,優化器會將它分割成若干不同的分割槽,把不能放入記憶體的部分寫入磁碟的臨時段,此時要有較大的臨時段以便盡量提高i/o效能。

執行過程:有a、b兩張表,a表小於b表,查詢優化器會先將a表在記憶體中建立一張以雜湊形式存在的查詢二叉樹c,然後取出b中的第一條記錄,從c中查詢匹配的記錄,如果有則放入等待返回的結果集中。然後從b中取出第二條記錄,重複上述過程,直到b中沒有記錄。

merge join:

排序合併連線中,首先會對進行連線的兩張表進行排序操作,然後對排序後的結果集進行合併連線。

執行過程:優化器首先對錶a、b進行排序操作,生成兩張臨時表c、d。然後對c、d進行合併連線。

通常情況下,雜湊連線的效果比合併連線要好,但如果源資料上有索引,或者結果已經排過序,在執行排序合併的時候就不需要排序了,這時合併連線的效能會優於雜湊連線。

參考:postgresql修煉之道   唐城

postgresql 的三種日誌

最近在模擬主備切換,備機可以成功切換成主機,但是主機未成功切換成備機,翻閱資料後發現是日誌歸檔設定的問題。情景描述 主從複製,模擬主機當掉,主從切換。從機成功切換為主機,但主機切換為從機後服務無法啟動,檢視日誌後,報如下錯誤 error requested wal segment 000000020...

mysql 連線三種方式 mysql的三種連線方式

sql的三種連線方式分為 左外連線 右外連線 內連線,專業術語分別為 left join right joing inner join 內連線inner join 使用比較運算子來根據指定的連線的每個表都有的列的值來進行匹配連線,如果對應的列值不存在,則連線的所有表對應的該列值都不會進行連線,也就是...

PostgreSQL 10 0 的三種日誌

當前使用版本為postgresql postgres localhost psql psql 10.7 網路上還存在大量的帖子,關於pg log,xlog,clog 剛剛接觸pg的我一直沒有找到這些目錄,查資料發現,從pg 10.0開始,目錄的名稱已經更改 pg xlog pg wal wal 日誌...