OracleデータベースでDBAのような基本的な責任を引き継ぎましたが、結合とグループ化を多く含むクエリを実行しようとすると、ORA-01652エラーが発生します。ここに私が得るエラーがあります:
ORA-01652: unable to extend temp segment by 128 in tablespace TEMP
01652. 00000 - "unable to extend temp segment by %s in tablespace %s"
*Cause: Failed to allocate an extent of the required number of blocks for
a temporary segment in the tablespace indicated.
*Action: Use ALTER TABLESPACE ADD DATAFILE statement to add one or more
files to the tablespace indicated.
エラーメッセージのアドバイスを受け(または少なくとも試みました)、新しいデータファイルを作成しました。これは私がそのために使用したコマンドです:
ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/Oracle/oradata/ABCDEFG/temp02.dbf'
SIZE 1024M REUSE AUTOEXTEND ON NEXT 50M MAXSIZE 4096M;
DBA_TEMP_FILES
を調べると、TEMPテーブルスペースに関連付けられている古いファイルと新しいファイルの両方が表示されていますが、クエリを再実行しようとすると、同じエラーメッセージが表示されます。
だから、私の質問は、私が実行しているクエリが大きいがthat大きいわけではないのに、なぜこのエラーが依然として発生するのかということです。データファイルを正しく作成しましたか?これをさらに診断するにはどうすればよいですか?
各テーブルスペースには、データを格納するために使用する1つ以上のデータファイルがあります。
データファイルの最大サイズは、データベースのブロックサイズによって異なります。私は、デフォルトでは、データファイルあたりの最大GBが残っていると思います。
実際の許容サイズについては、以下を実行します。
select value from v$parameter where name = 'db_block_size';
取得した結果を下の最初の列と比較してください。これにより、データファイルの最大サイズがわかります。
私はOracle Personal Edition 11g r2を使用しており、デフォルトのインストールでは8,192ブロックサイズ(データファイルあたり32GB)でした。
Block Sz Max Datafile Sz (Gb) Max DB Sz (Tb)
-------- -------------------- --------------
2,048 8,192 524,264
4,096 16,384 1,048,528
8,192 32,768 2,097,056
16,384 65,536 4,194,112
32,768 131,072 8,388,224
このクエリを実行して、所有しているデータファイル、関連付けられているテーブルスペース、現在最大ファイルサイズに設定しているもの(前述の32GBを超えることはできません)を見つけることができます。
select bytes/1024/1024 as mb_size,
maxbytes/1024/1024 as maxsize_set,
x.*
from dba_data_files x
MAXSIZE_SETは、データファイルに設定した最大サイズです。また、AUTOEXTENDオプションをONに設定したかどうかも関係します(その名前はそれが意味することを行います)。
データファイルの最大サイズが小さいか、自動拡張がオンになっていない場合は、次のコマンドを実行します。
alter database datafile 'path_to_your_file\that_file.DBF' autoextend on maxsize unlimited;
ただし、そのサイズが32GB以下の場合、自動拡張がオンになっていると、はい、テーブルスペース用に別のデータファイルが必要になります。
alter tablespace system add datafile 'path_to_your_datafiles_folder\name_of_df_you_want.dbf' size 10m autoextend on maxsize unlimited;
また、インデックス専用のテーブルスペースを用意することは、一般的には良い/一般的な方法です(create indexステートメントでテーブルスペースを指定しておらず、デフォルトを使用しているため、実際にはそうではないようです) system tablespace)、そのようなテーブルスペースを作成した後、次のようなものを実行します(あなたの場合):
CREATE INDEX FTS_INDEX ON FILTERED_TEKLI_IIS_TABLOSU (ilAdi,ilceAdi,caddeAdi)
tablespace name_of_ts_for_indexes
(そのテーブルスペースとそのためのデータファイルを作成した後)、経由:
create tablespace name_of_ts_for_indexes datafile
'c:\app\xyz\oradata\orcl\name_of_ts_for_indexes01.dbf' autoextend on maxsize unlimited nologging;
これにより、テーブルが1つのテーブルスペースに配置され、インデックスが別のテーブルスペースに配置されます。
追加情報を提供してくれたBrian D.に感謝します。
クエリに4 GBを超えるTEMP
スペースが必要であると考える何らかの理由がない限り、非常に大きなテーブルから集計を構築するようなことを行わない限り、非常に珍しいことですが、クエリのように聞こえますバグがあります。 「たくさんの結合」を含むクエリがあり、TEMP
テーブルスペースが一貫して使い果たされた場合、クエリに1つ以上の結合条件が欠落していて、Oracleが1つ以上のデカルト結合(つまり、 1つのテーブルのN行と別のテーブルのM行は、結果セットではN * M行になります)。中程度に大きなテーブルであっても、大量の一時スペースが必要になります。
クエリプランを見ると、1つ以上のMERGE JOIN CARTESIAN
オペレーション。デカルト結合されたテーブルを特定できる場合は、欠落している結合条件を特定するのに役立ちます。
すべての結合条件がWHERE
句にある古い結合構文を使用している場合
SELECT ...
FROM a,
b,
c
WHERE a.foo = b.foo
sQL 99構文を使用してクエリを書き換えてみてください。これにより、一般的に結合条件が欠落していることに気付きやすくなります
SELECT ...
FROM a
JOIN b
ON( a.foo = b.foo )
JOIN c
<<oops, no join condition>>