私は次のようなテーブルを作成しています
create table tablename
as
select * for table2
エラーが発生しています
ORA-01652 Unable to extend temp segment by in tablespace
グーグルで検索したとき、通常、ORA-01652エラーが見つかりました
Unable to extend temp segment by 32 in tablespace
このような値は取得していません。このクエリを実行しました
select
fs.tablespace_name "Tablespace",
(df.totalspace - fs.freespace) "Used MB",
fs.freespace "Free MB",
df.totalspace "Total MB",
round(100 * (fs.freespace / df.totalspace)) "Pct. Free"
from
(select
tablespace_name,
round(sum(bytes) / 1048576) TotalSpace
from
dba_data_files
group by
tablespace_name
) df,
(select
tablespace_name,
round(sum(bytes) / 1048576) FreeSpace
from
dba_free_space
group by
tablespace_name
) fs
where
df.tablespace_name = fs.tablespace_name;
から取得: テーブルスペースの空き領域を見つける
そして、私が現在使用しているテーブルスペースには約32GBの空き領域があることがわかりました。私もテーブルを作成してみました
create table tablename tablespace tablespacename
as select * from table2
しかし、同じエラーが再び発生します。問題がどこにあり、どのように解決するのか、誰でも私にアイデアを与えることができますか?参考までに、selectステートメントは40,000,000レコードを取得します。
これに対する解決策を見つけました。 TEMPと呼ばれる一時的な表領域があり、distinct、joinなどの操作のためにデータベースによって内部的に使用されます。クエリ(4つの結合)が約5,000万件のレコードをフェッチするため、TEMPテーブルスペースには、すべてのデータを占有するスペースがありません。そのため、表領域に空き領域があってもクエリは失敗します。したがって、TEMP表領域のサイズを増やした後、問題は解決しました。これが同じ問題を抱えている人を助けることを願っています。ありがとう:)
次のコマンドを実行して、新しいデータファイルを作成します。
alter tablespace TABLE_SPACE_NAME add datafile 'D:\Oracle\Oradata\TEMP04.dbf'
size 2000M autoextend on;
新しいデータファイルを作成する必要はありません。既存の表領域データファイルを拡張できます。
以下を実行して、既存のテーブルスペースのファイル名を決定します。
SELECT * FROM DBA_DATA_FILES;
次に、データファイルのサイズを次のように拡張します(ファイル名を前のクエリのファイル名に置き換えます)。
ALTER DATABASE DATAFILE 'D:\ORACLEXE\ORADATA\XE\SYSTEM.DBF' RESIZE 2048M;
同じエラーメッセージが表示されましたが、dbaではないため、「dba_free_space」などのテーブルにアクセスできません。使用可能なスペースを確認するために以前の回答を使用しましたが、まだスペースがたくさんあります。ただし、テーブル全体のスキャンを可能な限り減らした後。問題は解決しました。私の推測では、Oracleは一時テーブルを使用して完全なテーブルスキャンデータを格納していると考えられます。データサイズが制限を超えると、エラーが表示されます。これが同じ問題を抱えている人を助けることを願っています