J'ai une grande table Oracle, qui contient 542512 lignes. Il a trois colonnes et quand j'essaie de créer un index pour cela avec la commande suivante:
CREATE INDEX FTS_INDEX ON FILTERED_TEKLI_IIS_TABLOSU (ilAdi,ilceAdi,caddeAdi)
Oracle donne l'erreur suivante:
SQL Error: ORA-01652: unable to extend temp segment by 128 in tablespace SYSTEM
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.
J'ai recherché cette erreur et découvert qu'elle est produite lorsque Oracle n'a pas assez d'espace pour stocker des données intermédiaires lors de l'exécution d'opérations telles que la jonction de tables, la création d'index, etc. sur des tables volumineuses. Mais je n'ai pas trouvé de solution claire pour cela. Ces commandes ALTER TABLESPACE et ADD DATAFILE semblent faire l'affaire, mais je ne sais pas comment les appeler ni avec quels paramètres. Toute aide serait appréciée.
Chaque espace de table dispose d'un ou de plusieurs fichiers de données qu'il utilise pour stocker des données.
La taille maximale d'un fichier de données dépend de la taille de bloc de la base de données. Je crois que, par défaut, cela vous laisse un maximum de 32 Go par fichier de données.
Pour savoir si la limite réelle est de 32 Go, exécutez ce qui suit:
select value from v$parameter where name = 'db_block_size';
Comparez le résultat que vous obtenez avec la première colonne ci-dessous, et cela indiquera quelle est la taille maximale de votre fichier de données.
J'ai Oracle Personal Edition 11g R2 et dans une installation par défaut, il avait une taille de bloc de 8 192 (32 Go par fichier de données).
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
Vous pouvez exécuter cette requête pour rechercher les fichiers de données que vous possédez, les tablespaces auxquels ils sont associés et la configuration actuelle de la taille de fichier maximale (qui ne peut pas dépasser les 32 Go susmentionnés):
select bytes/1024/1024 as mb_size,
maxbytes/1024/1024 as maxsize_set,
x.*
from dba_data_files x
MAXSIZE_SET est la taille maximale que vous avez définie pour le fichier de données. Il est également important de savoir si vous avez défini l’option AUTOEXTEND sur ON (son nom fait ce qu’il implique).
Si votre fichier de données a une taille max faible ou si autoextend n'est pas activé, vous pouvez simplement exécuter:
alter database datafile 'path_to_your_file\that_file.DBF' autoextend on maxsize unlimited;
Cependant, si sa taille est d'environ 32 Go/32 Go si un autoextend est activé, alors oui, vous avez besoin d'un autre fichier de données pour le tablespace:
alter tablespace system add datafile 'path_to_your_datafiles_folder\name_of_df_you_want.dbf' size 10m autoextend on maxsize unlimited;