web-dev-qa-db-ja.com

ORA-01652表領域で一時セグメントを拡張できません

私は次のようなテーブルを作成しています

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レコードを取得します。

24

これに対する解決策を見つけました。 TEMPと呼ばれる一時的な表領域があり、distinct、joinなどの操作のためにデータベースによって内部的に使用されます。クエリ(4つの結合)が約5,000万件のレコードをフェッチするため、TEMPテーブルスペースには、すべてのデータを占有するスペースがありません。そのため、表領域に空き領域があってもクエリは失敗します。したがって、TEMP表領域のサイズを増やした後、問題は解決しました。これが同じ問題を抱えている人を助けることを願っています。ありがとう:)

36

次のコマンドを実行して、新しいデータファイルを作成します。

alter tablespace TABLE_SPACE_NAME add datafile 'D:\Oracle\Oradata\TEMP04.dbf'            
   size 2000M autoextend on;
6
Maria Ruchko

新しいデータファイルを作成する必要はありません。既存の表領域データファイルを拡張できます。

以下を実行して、既存のテーブルスペースのファイル名を決定します。

  SELECT * FROM DBA_DATA_FILES;

次に、データファイルのサイズを次のように拡張します(ファイル名を前のクエリのファイル名に置き換えます)。

  ALTER DATABASE DATAFILE 'D:\ORACLEXE\ORADATA\XE\SYSTEM.DBF' RESIZE 2048M; 
2
Templar

同じエラーメッセージが表示されましたが、dbaではないため、「dba_free_space」などのテーブルにアクセスできません。使用可能なスペースを確認するために以前の回答を使用しましたが、まだスペースがたくさんあります。ただし、テーブル全体のスキャンを可能な限り減らした後。問題は解決しました。私の推測では、Oracleは一時テーブルを使用して完全なテーブルスキャンデータを格納していると考えられます。データサイズが制限を超えると、エラーが表示されます。これが同じ問題を抱えている人を助けることを願っています

0
Carl Ko