大數(shù)據(jù)“復活”記
681
2025-04-06
有些SQL語句,會出現(xiàn)中間結(jié)果集太大,內(nèi)存放不下,需要落盤到外存(比如存在對大數(shù)據(jù)量進行聚集等操作,導致聚集操作的中間結(jié)果集在內(nèi)存中放不下時會下盤),且落盤生成的臨時數(shù)據(jù)文件占用空間過大,則會影響正常的數(shù)據(jù)寫入業(yè)務無法執(zhí)行,磁盤只能提供只讀操作。
對于上述場景,可以通過兩種方式,來控制用戶執(zhí)行過程中間結(jié)果集可落盤的數(shù)額,當超過限額,會報錯終止該語句的執(zhí)行,以防臨時數(shù)據(jù)文件占用空間過大:
1. ? ?方案1:設置每個線程的臨時文件落盤數(shù)據(jù)量限制
2. ? ?方案2:為用戶設置中間結(jié)果集落盤空間限額
方案1:設置每個線程的臨時文件落盤數(shù)據(jù)量限制
設置GUC參數(shù)temp_file_limit可以限制每個線程的臨時文件落盤數(shù)據(jù)量限制。temp_file_limit屬于SUSET類型參數(shù),取值范圍:整型,單位為KB。其中-1表示沒有限制。默認值:-1。
1.? ? 如何設置temp_file_limit參數(shù)
可通過gs_guc工具進行全局設置,如下:
gs_guc reload -Z coordinator -Z datanode -N all -I all -c "temp_file_limit = 1024"
2.? ? temp_file_limit取值計算公式
可以用下面的公式粗略的計算一個temp_file_limit的取值:temp_file_limit = 預計的總下盤量/同時下盤線程數(shù)
總下盤量一般可設置為可用空間的20%,這個百分比可根據(jù)用戶的可接受程度進行調(diào)節(jié)。同時下盤線程數(shù)是業(yè)務運行中,通常情況下并發(fā)的query中產(chǎn)生中間臨時數(shù)據(jù)下盤的線程數(shù)。隨著數(shù)據(jù)庫中存儲的數(shù)據(jù)量增加,temp_file_limit的值要適時調(diào)整。
注意:
此參數(shù)是限制每個線程的臨時文件落盤數(shù)據(jù)量,如果一個query有多個線程,單個線程落盤數(shù)據(jù)量超過此參數(shù)限制,query會報錯退出。如果每個線程都沒超過限制,但多個線程下盤數(shù)據(jù)量累計超過此參數(shù)限制,并不會報錯退出。
3.? ? 示例
以TPC-DS 1x數(shù)據(jù)中的customer_demographics表為例。
SQL查詢不下推,中間結(jié)果集僅在CN上落盤
postgres=# show temp_file_limit; temp_file_limit ----------------- 1MB (1 row) postgres=# set enable_stream_operator=off; SET postgres=# explain select * from customer_demographics c1, customer_demographics c2 order by c1.cd_demo_sk; QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------ id | operation | E-rows | E-width | E-costs ----+--------------------------------------------------------------------------+---------------+---------+------------------ 1 | -> Sort | 3689472640000 | 112 | 2329492473090.72 2 | -> Nested Loop (3,4) | 3689472640000 | 112 | 36894726400.00 3 | -> Data Node Scan on customer_demographics "_REMOTE_TABLE_QUERY_" | 1920800 | 56 | 0.00 4 | -> Data Node Scan on customer_demographics "_REMOTE_TABLE_QUERY_" | 1920800 | 56 | 0.00 (6 rows) postgres=# select * from customer_demographics c1, customer_demographics c2 order by c1.cd_demo_sk; ERROR: temporary file size exceeds temp_file_limit (1024kB)
方案2:為用戶設置中間結(jié)果集落盤空間限額
1.? ? 如何設置用戶中間結(jié)果集落盤空間限額
有兩種方式可以設置用戶中間結(jié)果集落盤空間限額:
1) ? ?通過CREATE USER指定SPILL SPACE,為新建用戶設置中間結(jié)果集落盤限額
CREATE USER user_name … SPILL SPACE 'spillspacelimit';
2) ? ?通過ALTER USER指定SPILL SPACE,修改已有用戶的中間結(jié)果集落盤空間限額
ALTER USER user_name … SPILL SPACE 'spillspacelimit';
比如:
CREATE USER u1 PASSWORD ‘a(chǎn)bcd@1234’ SPILL SPACE 'unlimited'; --創(chuàng)建用戶并設置中間結(jié)果集落盤限額為無限制
ALTER USER u1 SPILL SPACE '1G'; --修改用戶u1的中間結(jié)果集落盤限額為1G
說明:
1) ? ?此設置是對所有節(jié)點生效的,即一條SQL在集群的CN和所有DN的落盤數(shù)據(jù)量之和超過限制,則語句就會報錯終止。
2) ? ?當中間結(jié)果集落盤時,該用戶的臨時文件落盤數(shù)據(jù)量相應增加;當臨時文件刪除時,該用戶的臨時文件落盤數(shù)據(jù)量相應減少。
3) ? ?此設置是用戶級的,如果同一用戶同時并發(fā)運行多個query,則會累計每個query中間結(jié)果集落盤數(shù)據(jù)量。
注意:
要使上面的設置生效,需要設置GUC參數(shù)enable_perm_space為on。
如果多個用戶都會執(zhí)行大量中間結(jié)果集下盤操作,那么需要對涉及到的每個用戶都進行設置。
2.? ? 示例
示例1:中間結(jié)果集在CN和DN上都會落盤,總的落盤數(shù)據(jù)量會超過1G
postgres=# create user u1 password 'abcd@1234'; CREATE USER postgres=# grant select on customer_demographics to u1; GRANT postgres=# alter user u1 spill space '1G'; ALTER USER postgres=# alter session set session authorization u1 password 'abcd@1234'; SET postgres=> select * from customer_demographics c1, customer_demographics c2 order by c1.cd_demo_sk; ERROR: spill space is out of user's spill space limit
示例2:SQL查詢不下推,中間結(jié)果集僅在CN上落盤
postgres=# set enable_stream_operator=off; SET postgres=# alter session set session authorization u1 password 'abcd@1234'; SET postgres=> explain select * from customer_demographics c1, customer_demographics c2 order by c1.cd_demo_sk; QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------ id | operation | E-rows | E-width | E-costs ----+--------------------------------------------------------------------------+---------------+---------+------------------ 1 | -> Sort | 3689472640000 | 112 | 2329492473090.72 2 | -> Nested Loop (3,4) | 3689472640000 | 112 | 36894726400.00 3 | -> Data Node Scan on customer_demographics "_REMOTE_TABLE_QUERY_" | 1920800 | 56 | 0.00 4 | -> Data Node Scan on customer_demographics "_REMOTE_TABLE_QUERY_" | 1920800 | 56 | 0.00 (6 rows) postgres=> select * from customer_demographics c1, customer_demographics c2 order by c1.cd_demo_sk; ERROR: spill space is out of user's spill space limit
總結(jié)
第一種方案偏重于限制每個線程的臨時文件下盤量,第二種方案偏重于限制用戶的臨時文件下盤量,要結(jié)合業(yè)務的目的來選擇更適合的參數(shù)及參數(shù)設置,避免發(fā)生臨時文件下盤量過大影響正常業(yè)務執(zhí)行。
EI企業(yè)智能 Gauss AP 分布式 數(shù)據(jù)倉庫服務 GaussDB(DWS)
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。