成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

從Hash Join的執行計劃的細節中能看到點啥

數據庫 其他數據庫
不過任何事情都是有利有弊,如果你的服務器的CPU資源十分緊張,那么過多的并行HASH JOIN可能會導致你的CPU資源經常出現不足,引發其他問題。如果存在這種情況,那么關閉并行HASH JOIN,讓每個HASH JOIN變得略微慢一點,但是確保CPU資源不過載,也是一種策略。?

?HASH JOIN是大數據量表連接中最為常用的方式,與最為常用的NESTED LOOP相比,其應用場景不同。對于兩張表的連接,NESTED LOOP適合于類似查電話號碼的應用場景,如果領導給你一張清單,讓你去查一下幾家企業的電話號碼,那么你要做的是找到一本電話號碼本,根據公司名稱的索引,挨個查一遍,很快就可以完成了。這種方式就是著名的NESTED LOOP,通過數個快速的循環,完成兩個行源的關聯操作(待查清單,電話號碼簿)。

如果這個任務改一下,領導給你的清單上有幾萬家企業,那么我們還這么一條條的去查,那不傻了。這時候,就不適合用NESTED LOOP循環了,HASH JOIN是比較快速的解決方法。很多SQL的執行計劃出現錯誤,有很大一部分就是選擇錯誤使用了NESTED LOOP和HASH JOIN。因此現在一些CBO的優化器中,都有針對NESTED LOOP和HASH JOIN的主動糾偏技術。Oracle 19C的可調節執行計劃主要就是在執行NESTED LOOP的過程中一旦發現循環數量超出評估預期,則可以動態改為HASH JOIN。

剛開始就有點扯遠了,今天我們的重點不是討論NL和HASH JOIN的差異,而是帶大家看看PG數據庫的HASH JOIN執行計劃中的一些容易被忽略的點,在查看執行計劃的時候,如果能夠比較好的抓住這些關注點,對于SQL優化來說很有幫助。

圖片

可能有朋友要說了,反正都是HASH JOIN,執行計劃都差不多,有啥可看的。那么我們來看看上面的執行計劃里的紅框里的內容吧,Batches :32,這個是啥意思?如果你以前是Oracle DBA,那么優化排序、one-pass 排序,multi-pass排序的概念應該還有印象吧。當需要做排序或者HASH TABLE的數據量太大,超出了SORT AREA SIZE的限制,那么這次排序/HASH join就無法一次完成,必須切分為多個分區,一個個的完成。在PG的HASH JOIN里,就是把HASH JOIN切分為多個BATCHES。因為某個BATCH完成后需要暫存在臨時文件中,因此遇到這種情況我們一般都可以看到temp written這個內容,這部分內容我也用紅框標注出來了。

圖片

這種排序區不足導致的問題會帶來什么樣的性能問題呢?我們來看這個例子,BATCHES:1,也就是無需通過分區完成,此時使用了4540KB的WORK_MEM。實際上我給大家演示這個案例的時候,第一個例子用了256KB的work_mem設置,當然無法滿足4M多的內存需求了。而第二個例子我使用了一個極大的work_mem(256MB),當然實際上的內存使用以執行計劃中的為準。一次性在內存中完成HASH JOIN的好處是什么呢?當然是執行效率,我們可以看出第二個執行只用了90毫秒,而分裂為32個BATCH的執行花了239毫秒。

看到這里可能有朋友要說了,既然效果那么好,那么我們把WORK_MEM參數設的足夠大不就行了。實際上設置過大的WORK_MEM也是存在隱患的。如果我們的物理內存不是很大,那么設置過大的WORK_MEM可能導致極端情況下,物理內存過度消耗而導致更嚴重的問題。

WORK_MEM參數是可會話級動態設置的,如果我們的某些要做大型排序或者HASH JOIN的SQL能夠在應用層面做設置,執行大型SQL的時候設置一個較大的值,SQL執行完畢RESET一下參數,這樣WORK_MEM的使用效率是最高的。否則我們為了滿足大型SQL的需求,就需要設置一個做大值。當然雖然我們設置了WORK_MEM并不一定就會消耗那么多的內存,不過活躍會話數*WORK_MEM這個數字還是需要關注的,確保我們的物理內存有那么多的空閑可用(參考可用內存,而不是FREE內存)是十分必要的。如果我們不確定系統最大的內存使用量,并且物理內存比較緊張,那么設置大一點的SWAP是十分必要的,在極端情況下可以確保系統不會因為OOM而出大問題。

圖片

上面的這個執行計劃也是我們經常看到的,PG數據庫支持并行HASH JOIN,并且默認是打開的。如果我們的系統中的CPU資源是充足的,那么enable_parallel_hash參數確保打開狀態就行了。并行HASH JOIN可以通過過parallel seq scan和parallel hash join兩種機制來進一步提高HASH JOIN的性能。我們可以看到,通過并發,這個SQL的執行效率進一步的提升了。

不過任何事情都是有利有弊,如果你的服務器的CPU資源十分緊張,那么過多的并行HASH JOIN可能會導致你的CPU資源經常出現不足,引發其他問題。如果存在這種情況,那么關閉并行HASH JOIN,讓每個HASH JOIN變得略微慢一點,但是確保CPU資源不過載,也是一種策略。?

責任編輯:武曉燕 來源: 白鱔的洞穴
相關推薦

2025-05-09 09:07:45

2021-12-13 22:15:29

SQLOracle共享池

2011-09-14 17:03:17

數據庫執行計劃解析

2020-09-15 08:44:57

MySQL慢日志SQL

2009-11-10 16:00:05

Oracle執行計劃

2010-04-16 09:27:18

Ocacle執行計劃

2021-04-28 22:42:36

SaaS軟件技術

2022-08-15 15:09:26

SQL數據庫MySQL

2022-02-15 07:36:21

SQLEXPLAIN數據庫

2011-03-14 17:36:12

DB2更新執行計劃

2015-04-22 14:17:45

SQL SERVERMSSQL SERVE緩沖區

2021-03-17 09:35:51

MySQL數據庫explain

2023-09-21 10:55:51

MysqlSQL語句

2021-05-28 10:46:36

MySQL執行計劃

2011-05-17 09:32:25

DB2

2022-08-08 08:03:44

MySQL數據庫CBO

2011-08-18 14:10:51

Oracle不走索引

2024-09-12 15:16:14

2009-11-13 16:28:02

Oracle生成執行計

2010-09-07 14:11:04

DB2更新
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩黄 | 日韩一区二区三区视频在线观看 | 国产精品1区2区 | 毛片网站在线观看 | 成人免费av在线 | 免费高潮视频95在线观看网站 | 欧美一区二区成人 | 国产精品久久久久久久久久久久午夜片 | 精品一区久久 | 五月激情综合网 | 国产区免费视频 | 亚洲三级在线 | 久久9999久久| 亚洲国产一区二区在线 | 青青久在线视频 | 欧美日韩一区二区在线播放 | 人人鲁人人莫人人爱精品 | 亚洲成人中文字幕 | 美日韩免费视频 | 一区二区三区四区免费在线观看 | 99精品国产一区二区三区 | 美女爽到呻吟久久久久 | 91精品成人久久 | 妖精视频一区二区三区 | 欧美xxxx色视频在线观看免费 | av在线电影网 | av网站免费看 | 亚洲伦理自拍 | 国产免费拔擦拔擦8x高清 | 欧美专区在线 | 精品欧美一区二区三区久久久 | 99久久精品国产一区二区三区 | 免费电影av| 欧美综合视频 | 国产一区二区三区四区五区加勒比 | av综合站| 国产免费一区二区三区 | 18gay男同69亚洲网站 | 蜜桃视频成人 | 视频一区二区中文字幕 | 欧美一级片在线看 |