web-dev-qa-db-fra.com

ORA-01652 Impossible d'étendre un segment temporaire dans un espace de table

Je crée une table comme

create table tablename
as
select * for table2

Je reçois l'erreur

ORA-01652 Unable to extend temp segment by in tablespace

Lorsque je cherchais dans Google, je trouvais généralement une erreur ORA-01652 indiquant une valeur telle que

Unable to extend temp segment by 32 in tablespace

Je ne reçois pas une telle valeur.J'ai couru cette requête

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; 

Extrait de: Trouver de l'espace libre sur les tablespaces

et j'ai trouvé que le tablespace que j'utilise utilise actuellement environ 32 Go d'espace libre. J'ai même essayé de créer une table comme

create table tablename tablespace tablespacename
as select * from table2 

mais je reçois à nouveau la même erreur. Quelqu'un peut-il me donner une idée du problème et de la manière de le résoudre? Pour votre information, la déclaration choisie me rapporterait 40 000 000 enregistrements.

24

J'ai trouvé la solution à cela. Il existe un espace de table temporaire appelé TEMP, utilisé en interne par la base de données pour des opérations telles que distinct, jointure, etc. Depuis que ma requête (qui a 4 jointures) va chercher près de 50 millions d’enregistrements, le tablespace TEMP n’a pas beaucoup d’espace pour occuper toutes les données. Par conséquent, la requête échoue même si mon espace de table a de l'espace libre. Ainsi, après avoir augmenté la taille de l'espace de table TEMP, le problème a été résolu. J'espère que cela aide quelqu'un avec le même problème. Merci :)

36

Créez un nouveau fichier de données en exécutant la commande suivante:

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

Vous n'avez pas besoin de créer un nouveau fichier de données; vous pouvez étendre vos fichiers de données d'espace de table existants.

Exécutez les opérations suivantes pour déterminer le nom de fichier du tablespace existant:

  SELECT * FROM DBA_DATA_FILES;

Étendez ensuite la taille du fichier de données comme suit (remplacez le nom de fichier par celui de la requête précédente):

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

J'ai rencontré le même message d'erreur mais je n'ai aucun accès à la table comme "dba_free_space" car je ne suis pas un dba. J'utilise certaines réponses précédentes pour vérifier l'espace disponible et il me reste encore beaucoup d'espace. Cependant, après avoir réduit la totalité de la table, balayez le plus possible. Le problème est résolu. À mon avis, Oracle utilise une table temporaire pour stocker les données d'analyse complètes de la table. Si la taille des données dépasse la limite, l'erreur sera affichée. J'espère que cela aide quelqu'un avec le même problème

0
Carl Ko