今天接到用戶反映,執行一個查詢select * from xxx,就會掛起,後端報警文件在報大池沒法分配的問題,具體以下:
Tue Oct 11 15:26:06 2016
Errors in file c:\app\administrator\diag\rdbms\cdal\cdal\trace\cdal_p040_4128.trc (incident=113581):
ORA-04031: 沒法分配 268512 字節的共享內存 ("large pool","unknown object","large pool","PX msg pool")
能夠看出以上是由於並行查詢致使了大池不足形成。
可先了解下 large pool:
大池是SGA中的一塊可選內存池,大池主要提供了大內存段,大池最大大小爲4G。根據須要時配置,主要用到大池的狀況:
1. 用於共享服務(Shared Server MTS方式中)的會話內存和Oracle分佈式事務處理的Oracle XA接口
2. 使用並行查詢(Parallel Query Option PQO)時
3. I/O服務器進程用的內存(緩衝)
4. Oracle備份和恢復操做(啓用了RMAN時)
大池沒有LRU列表。這和共享池中的保留空間不一樣,保留空間和共享池中其餘分配的內存使用一樣的LRU列表。
大塊內存從不會換出大池中,內存必須是顯式的被每一個會話分配並釋放。
解決過程:1.檢查是否開啓了並行.
select * from dba_tables where degree<>1;
select * from dba_indexes where degree<>1;
2.發現是表開啓了並行,所以可關閉並行:
ALTER TABLE XX.XXX NOPARALLEL;
3.若是large pool大小不足,可根據實際需求調整大小:
ALTER SYSTEM SET LARGE_POOL_SIZE=xxM scope=spfile;
後經過檢查,該語句執行,執行計劃一直走並行:
PLAN_TABLE_OUTPUT
Plan hash value: 2873591275
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time
| 0 | SELECT STATEMENT | | 1 | 12 | 2 (0)| 00:00:01
| 1 | PX COORDINATOR | | | | |
| 2 | PX SEND QC (RANDOM)| :TQ10000 | 1 | 12 | 2 (0)| 00:00:01
| 3 | PX BLOCK ITERATOR | | 1 | 12 | 2 (0)| 00:00:01
| 4 | TABLE ACCESS FULL| xxx | 1 | 12 | 2 (0)| 00:00:01
Note
-----
- Degree of Parallelism is 2 because of table property
15 rows selected
SQL> select table_name,degree from user_tables where table_name='xxx';
TABLE_NAME DEGREE
xxx 2
去掉該表的並行度,後,再去執行,以後就不走並行了.
alter table xxx noparallel;
後話:
總以爲很蹊蹺,內存怎麼會不夠呢,物理機器有128g內存,檢查數據庫發現,只分配了800m給memory_target,再一檢查,操做系統是32位,
問題已經很清楚了.根本解決辦法,就是升級到64位.