oracle pga使用控制

 

oracle pga使用控制

我们知道从9i开始oracle提供了自动管理pga的功能,从此我们可以不管sort_area_size,hash_area_size等等烦人的设置,也不用再去计算繁琐的pga大小。但是怎么控制每个session使用pga的大小呢,会不会出现一个session用完所有pga,而其他session得不多空间的状况吗?
带着这个疑问我们可以来做一个实验。
实验的步骤很简单,初始pga_aggregate_target设定为100m,我们做一个排序的大查询,然后查看pga的使用空间。
然后修改pga_aggregate_target为1g,在做一个大查询,查看pga使用空间。
SQL> startup pfile=/test/inittest.ora
ORACLE instance started.

Total System Global Area 2710294504 bytes
Fixed Size                   454632 bytes
Variable Size             805306368 bytes
Database Buffers         1903992832 bytes
Redo Buffers                 540672 bytes
Database mounted.
Database opened.

SQL> show parameter pga

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target                 big integer 100000000



SQL> conn test/test
Connected.
SQL> select name,value from v$statname a,v$mystat b where a.statistic#=b.statistic# and a.name like '%pga%';

NAME                                                                  VALUE
---------------------------------------------------------------- ----------
session pga memory                                                   243208
session pga memory max                                               243208
这里可以看到初始连接时pga使用了240k左右
SQL> set autotrace trace;


SQL> select title from test order by starts,ends,title,zoo,city;


2997531 rows selected.


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=129273 Card=2932520
          Bytes=173018680)

   1    0   SORT (ORDER BY) (Cost=129273 Card=2932520 Bytes=173018680)
   2    1     PARTITION RANGE (ALL)
   3    2       TABLE ACCESS (FULL) OF 'TEST' (Cost=84738
          Card=2932520 Bytes=173018680)





Statistics
----------------------------------------------------------
        475  recursive calls
         75  db block gets
     930726  consistent gets
     962505  physical reads
         60  redo size
  113681365  bytes sent via SQL*Net to client
    2198688  bytes received via SQL*Net from client
     199837  SQL*Net roundtrips to/from client
         37  sorts (memory)
          1  sorts (disk)
    2997531  rows processed




SQL> set autotrace off;
SQL> select name,value from v$statname a,v$mystat b where a.statistic#=b.statistic# and a.name like '%pga%';

NAME                                                                  VALUE
---------------------------------------------------------------- ----------
session pga memory                                                   457496
session pga memory max                                              6355736

做完一个大查询,pga的使用峰值是达到了6m左右,这其中可能包含了一部分pga自己的开销

关闭数据库,修改pga_aggregate_target为1g,再重启数据库
SQL> conn / as sysdba
Connected.
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> exit

[oracle@wanghai4 oracle]$ sqlplus "/as sysdba"

SQL*Plus: Release 9.2.0.4.0 - Production on Sun Jul 18 11:46:53 2004

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

Connected to an idle instance.

SQL> startup pfile=/test/inittest.ora
ORACLE instance started.

Total System Global Area 2710294504 bytes
Fixed Size                   454632 bytes
Variable Size             805306368 bytes
Database Buffers         1903992832 bytes
Redo Buffers                 540672 bytes
Database mounted.
Database opened.
SQL> conn test/test
Connected.
SQL> select name,value from v$statname a,v$mystat b where a.statistic#=b.statistic# and a.name like '%pga%';

NAME                                                                  VALUE
---------------------------------------------------------------- ----------
session pga memory                                                   250792
session pga memory max                                               381864

SQL> show parameter pga

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target                 big integer 1000000000
SQL> set autotrace trace;
SQL> select title from test order by starts,ends,title,zoo,city;




2997531 rows selected.


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=112995 Card=2932520
          Bytes=173018680)

   1    0   SORT (ORDER BY) (Cost=112995 Card=2932520 Bytes=173018680)
   2    1     PARTITION RANGE (ALL)
   3    2       TABLE ACCESS (FULL) OF 'TEST' (Cost=84738
          Card=2932520 Bytes=173018680)





Statistics
----------------------------------------------------------
       3740  recursive calls
         28  db block gets
     931577  consistent gets
     955856  physical reads
         60  redo size
  113681365  bytes sent via SQL*Net to client
    2198688  bytes received via SQL*Net from client
     199837  SQL*Net roundtrips to/from client
         77  sorts (memory)
          1  sorts (disk)
    2997531  rows processed

SQL> SQL> SQL> SQL> set autotrace off;
SQL> select name,value from v$statname a,v$mystat b where a.statistic#=b.statistic# and a.name like '%pga%';

NAME                                                                  VALUE
---------------------------------------------------------------- ----------
session pga memory                                                   456568
session pga memory max                                             50263928
可以看到这次大查询使用了近50m的pga空间,为什么第一次只使用了6m呢,这是因为oracle会限制每个session使用pga的最大空间,
每个session可以使用到最大至5%pga的总空间,所以第一次可以使用到5m左右的空间,加上pga自己的开销,使用了一共6m。第二次
由于总pga大小扩大了,所以session使用的pga大小也差不多是5%的总pga大小.oracle很好的控制了pga的使用,避免了一个session
占用大部分pga的情况。不过,还存在一种特例,在并行操作的情况下session pga可以使用到30%总pga空间。
<think>好的,我现在要解决用户在IAR编译器中遇到的错误:“incomplete type is not allowed”。首先,我需要理解这个错误的含义和常见原因。根据我的知识库,这个错误常发生在代码中使用了未完全定义的类型,比如结构体或联合体声明了但未定义,或者前向声明了某个类型但没有提供完整的定义。 首先,我应该检查用户代码中是否有结构体或联合体的声明但没有定义的情况。比如,如果有一个结构体声明为`struct MyStruct;`,但没有后续的完整定义,那么在需要该结构体大小或成员的地方,编译器就会报这个错误。这时候,需要用户补全结构体的定义,包括成员变量。 其次,检查是否在头文件中只声明了类型而没有包含定义。例如,如果在头文件中使用前向声明,但在使用该类型的源文件中没有包含实际的定义头文件,这也会导致错误。此时,需要确保在使用类型的地方包含了正确的头文件,或者将前向声明替换为完整的定义。 另外,还要考虑typedef的问题。如果用户使用了typedef创建别名,但原始类型未完全定义,同样会引发错误。例如,`typedef struct MyStruct MyType;`之后,如果尝试使用MyType但MyStruct尚未定义,就会出错。需要确保在使用typedef之前,原始类型已经被完整定义。 此外,数组声明中的类型不完整也是一个常见原因。比如声明数组时,如果元素类型未完全定义,编译器无法确定数组的大小,导致错误。需要检查数组声明中的类型是否已经完整定义。 可能还有其他情况,比如在C和C++混合编程时,如果没有正确使用extern "C",或者在头文件中遗漏了必要的包含,也可能导致类型不完整。需要用户检查这些方面。 接下来,我需要将这些可能的原因整理成清晰的解决步骤,并给出具体的代码示例,帮助用户理解如何修改。同时,根据用户提供的引用内容,虽然引用[1]和引用[2]是关于其他错误的,但用户可能希望看到类似的结构,即分点说明解决方案,并引用相关资源。 最后,生成相关问题,帮助用户进一步了解可能相关的编译错误,比如类型未定义、前向声明问题等。这样用户可以有更全面的认识,预防其他类似错误的发生。</think>### IAR编译器错误'incomplete type is not allowed'解决方案 该错误表示代码中使用了**未完全定义的类型**,编译器无法确定其内存布局或成员信息。以下是具体原因及解决方法: #### 1. 结构体/联合体未定义完整 若声明了结构体但未定义成员,在实例化时会报错: ```c struct MyStruct; // 前向声明不完整 struct MyStruct var; // 错误:使用未完成类型 ``` **解决方案**:补全类型定义 ```c struct MyStruct { int id; char name[20]; }; ``` #### 2. 头文件包含缺失 当跨文件使用类型时,需确保定义可见: ```c // file.h struct Data; // 前向声明 // file.c struct Data { // 实际定义 int value; }; ``` **解决方案**:在使用该类型的文件中包含定义头文件 ```c #include "file.c" // 包含实际定义 ``` #### 3. typedef别名问题 使用typedef时原始类型必须完整: ```c typedef struct Node NodeT; // 前向声明 NodeT* ptr; // 允许指针声明 NodeT instance; // 错误:不完整类型 ``` **解决方案**:先完成类型定义再typedef ```c struct Node { int data; struct Node* next; }; typedef struct Node NodeT; ``` #### 4. 数组声明不完整 数组元素类型必须完全定义: ```c struct Element; struct Element arr[10]; // 错误:元素类型未定义 ``` **解决方案**: ```c struct Element { int type; float value; }; struct Element arr[10]; // 合法 ``` #### 调试建议 1. 在IAR工程中搜索错误行号定位问题代码 2. 使用Go to Definition功能追踪类型定义 3. 检查所有头文件包含链 4. 确认没有循环依赖的头文件 编译器需要知道类型的完整信息才能: - 计算sizeof大小 - 分配内存空间 - 访问成员变量 - 进行类型对齐 [^1]: 类似类型转换错误可参考浮点转整型的类型适配问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值