首先咱們講一個故事:
你是上帝視角【1】,你給了小明100個棒槌【2】,這個時候來了10個叫作小花的人,小花能夠去倉庫裏拿麪粉作包子,可是作一次包子,須要借用小明的棒槌,假如每個小花都借用掉了10個棒槌,若是同時來了11個小花,前10個小花都能接到棒槌,第11個小花去找小明借棒槌的時候,小明就告訴她;「超出個人棒槌個數了,小花作包子失敗。」—— 這句話翻譯一下就是:「數據庫服務器報錯超出全局hashjoin空間,應用請求在數據庫執行失敗。」
可是呢,故事其實複雜一點,就是每個小花,根據本身的工做量,須要的棒槌個數,並不必定須要10個,因此也就是說,只有來的全部小花把棒槌都借用完了以後,小明纔會報錯。可是小明也不是一直會報錯,只要有任何一個小花,作完了,把借用的棒槌還回來了,小明就又能夠支撐新的小花了。
上面這個故事,對應的就是這兩個參數:
(來源:達夢數據庫dba手冊2.1.1中dm.ini的介紹)
小明一共有多少個棒槌,就是 HJ_BUF_GLOBAL_SIZE 設置的,默認值是500;
一個小花最多能夠借多少個棒槌,就是HJ_BUF_SIZE設置的,默認值是50;
可是呢,其實小花若是要借用10個棒槌,實際上還有一個參數控制小明一次給小花多少個棒槌(好比小明要給小花10個棒槌,能夠一次給1個給10次,也能夠一次給5個給兩次——這兩種代價其實會不同的)。一次給多少個,就是這個參數:
(來源:達夢數據庫dba手冊2.1.1中dm.ini的介紹)
好了,咱們回到問題,若是遇到小明報錯了怎麼辦呢?
【解決方法一】
不少狀況下,小花實際上是個傻子,就是實際上只須要1跟棒槌、一分鐘內就幹完的事情,結果她卻用了10跟棒槌,一天死活都幹不完,佔用的這10根棒槌也一直沒有還給小明。
換句話說就是要優化語句,消除掉這些傻小花。遇到這個問題的優先核心方法是:找出傻小花,讓她變聰明——找到慢語句,優化掉。
【解決方法二】
1) 擴大小明的棒槌個數——改大HJ_BUF_GLOBAL_SIZE
2) 減少單個小花能夠借用的棒槌上限——改小HJ_BUF_SIZ (有人會問,小花要10個棒槌,如今你給她設置成5個,她還能幹活麼?其實必定能夠,哪怕你限制她最多隻能借用1個,她也能夠幹活,只是一樣的或要乾的久一點而已——一樣的,也不是越多越好,若是自己只須要5個,設置成10個,也沒有意義。)
若是確認系統中,預期的sql均是符合預期的計劃,效率均沒有問題,確實須要高併發,就必須提升 HJ_BUF_GLOBAL_SIZE/HJ_BUF_SIZ的比值。同時,又因爲前一個參數是靜態參數(修改該參數後,須要重啓數據庫服務後才能夠生效),因此應急策略(不能重啓數據)的處理方式,僅僅只有【調小HJ_BUF_SIZ——這個參數是動態參數,修改後當即生效】。等有機會重啓數據庫服務時,再在重啓數據庫服務前,適當調大HJ_BUF_SIZ的同時,也保持較高的HJ_BUF_GLOBAL_SIZE/HJ_BUF_SIZ的值。
備註:
修改數據庫參數的方式:
Sp_set_para_value(1,’參數名字’,參數值);--當成sql執行;對於動態參數,直接修改後,當即生效;若是是靜態參數,如此修改,會報錯:沒法修改靜態配置參數
Sp_set_para_value(2,’參數名字’,參數值);--當成sql執行;對於動態參數或者靜態參數均可以用,修改後,須要重啓數據庫服務後才生效。sql