開発データベースでこのエラーを受け取っています。一部の特定のクエリで発生します(.NETアプリケーションを介した単純な挿入と削除)。データベースは1人のユーザーが使用しており、データベースの実行時間に関係なくエラーが発生します。
設定される唯一のメモリ関連のパラメータは次のとおりです:MEMORY_TARGET = 1.2G
Oracle 11.2 x64 Standard Edition One Windows Server 2008 R2
アプリケーションはおそらくバインド変数を使用していないため、SGAが断片化されています(バインドの代わりにリテラルを使用するSQLの複数のコピーでいっぱいになります)。
次のコマンドで共有プールをフラッシュすることで、問題を一時的に修正できます。
alter system flush shared_pool;
将来発生しないようにするための回避策があります。
カーソル共有をオンにして、データベースをバウンスします。
ALTER SYSTEM SET cursor_sharing='SIMILAR' SCOPE=BOTH;
これを修正する唯一の実際の方法は、バインド変数を使用するようにアプリケーションを書き直すことです。
上記の答えは少し古いです。
alter system flush shared_pool;
すぐに問題を軽減できますが、根本的な原因には対処できません。 cursor_sharingパラメータは2つの値を取ります。
FORCEまたはEXACT。 EXACTでは、再利用するカーソル(実行計画付きのSQL)に対してクエリを完全に一致させる必要があります。 "FORCE"を指定すると、クエリ内のすべての値がバインド変数に変更されます。これは、アプリケーションでバインド変数を使用しない場合に非常に便利です。データベースがそれを行います。
すでにcursor_sharing = FORCEを使用している場合。次に、メモリ割り当ての調整を検討する必要があり、システムが使用するメモリパラメータに応じて、次のクエリを使用してその値をどこに設定する必要があるかを把握できます。
SGA_TARGETおよびSGA_MAX__SIZE/PGA_TARGETおよびPGA_MAX_SIZEが使用されている場合(これらは一致している必要があります):select * from v $ sga_target_advice; v $ pga_target_adviceから*を選択します。
これは次のようになります。私の場合、これは実稼働前のシステムであり、長く見栄えがしません。
これはSGA_TARGET_ADVICEです。
SGA_SIZE_FACTORが1の行が現在の設定です。メモリーが小さすぎるシステムでは、SGA_SIZEとSGA_SIZE_FACTORの増加は、ESTD_DB_TIMEとESTD_DB_TIME_FACTORの劇的な減少を示すはずです。メモリーを増やして、再度増やしてもestd_db_timeにそれほど大きな変更が加えられないようにします。
ここでの私のケースでは、現在の負荷で、大きな打撃を受けることなくSGA_TARGETのサイズを簡単に80Gに減らすことができました。ただし、57G以下に削減すると、パフォーマンスの問題がますます劇的になります。
SGA_SIZE SGA_SIZE_FACTOR ESTD_DB_TIME ESTD_DB_TIME_FACTOR ESTD_PHYSICAL_READS ESTD_BUFFER_CACHE_SIZE ESTD_SHARED_POOL_SIZE CON_ID
---------- --------------- ------------ ------------------- ------------------- ---------------------- --------------------- ----------
5760 .0625 482104 .5257 50950730 76032 18176 0
11520 .125 482104 .5257 50950730 76032 18176 0
17280 .1875 482104 .5257 50950730 76032 18176 0
23040 .25 482104 .5257 50950730 76032 18176 0
28800 .3125 1560028 1.7011 174592866 6912 19456 0
34560 .375 1374046 1.4983 138703172 13824 18176 0
40320 .4375 1105895 1.2059 87207269 20736 18176 0
46080 .5 1028769 1.1218 72319466 27648 17664 0
51840 .5625 1000157 1.0906 66607889 34560 16896 0
57600 .625 980623 1.0693 62628637 41472 16128 0
63360 .6875 976129 1.0644 62628637 41472 21248 0
69120 .75 961456 1.0484 59805967 48384 21248 0
74880 .8125 945683 1.0312 56626641 55296 19456 0
80640 .875 933852 1.0183 54359334 62208 19456 0
86400 .9375 923765 1.0073 51867843 71424 16640 0
92160 1 917070 1 50950730 76032 18176 0
97920 1.0625 910467 .9928 49534300 82944 17408 0
103680 1.125 903131 .9848 47914066 89856 16640 0
109440 1.1875 896528 .9776 46385545 96768 15872 0
115200 1.25 891575 .9722 46385545 96768 21248 0
120960 1.3125 886990 .9672 45361435 103680 19456 0
126720 1.375 884331 .9643 44851928 110592 19456 0
132480 1.4375 880937 .9606 44194663 117504 19456 0
138240 1.5 875252 .9544 42915800 124416 18176 0
144000 1.5625 870116 .9488 41901880 131328 17920 0
149760 1.625 867915 .9464 41901880 131328 23040 0
155520 1.6875 867181 .9456 41769408 138240 23040 0
161280 1.75 866723 .9451 41769408 138240 28416 0
167040 1.8125 866631 .945 41769408 138240 32000 0
172800 1.875 866631 .945 41769408 138240 32000 0
178560 1.9375 866631 .945 41769408 138240 32000 0
184320 2 866631 .945 41769408 145152 32000 0
32 rows selected.
MEMORY_TARGETを使用する場合:
select * from v$memory_target_advice;
以前の答えに加えて、ALTER SESSION SET NLS_COMP=LINGUISTIC;ALTER SESSION SET NLS_SORT=GENERIC_M_CI;
何らかの理由でメモリがすぐに使い果たされます。別のNLS_SORTを使用すると、問題が消えます。