web-dev-qa-db-fra.com

Quelle est la différence entre une table temporaire et une table temporaire globale dans Oracle?

J'ai entendu ces deux termes "table temporaire" et "table temporaire globale" utilisés à peu près dans un contexte similaire.

Quelle est la différence entre les deux?

28
MOZILLA

Dans Oracle, il n'y a pas de différence. Lorsque vous créez une table temporaire dans une base de données Oracle, celle-ci est automatiquement globale et vous devez inclure le mot clé "Global". 

Le standard SQL, qui définit la manière dont le terme "GLOBAL TEMPORARY TABLE" est interprété, autorise une portée LOCAL ou GLOBAL. Cela permettrait une table spécifique à l'utilisateur (LOCAL) ou à tout le monde (GLOBAL). Oracle implémente uniquement la version GLOBAL. 

Les données que vous mettez dans une table temporaire Oracle sont spécifiques à votre session. Autrement dit, vous seul pouvez voir vos données, même si 100 utilisateurs utilisent tous la même table, et vos données sont supprimées de la table lorsque vous vous déconnectez (ou lorsque vous validez la transaction en cours), en fonction des paramètres de la table. 

Comparez cela avec MS SQL-Server, où les tables temporaires sont locales. Si vous en créez un, personne d'autre que vous ne saura que votre table temporaire existe. Dans Oracle, la création de la table temporaire permet à tout le monde (ainsi qu'à tous ceux qui ont accès à votre schéma) de voir la table. Lorsque vous vous déconnectez de votre session, la table SQL-Server est supprimée et doit être recréée pour la session suivante. Dans Oracle, la table temporaire fait désormais partie intégrante de votre schéma, même si les données ne le sont pas. 

52
Thomas Jones-Low

Comparez cela avec MS SQL-Server, où les tables temporaires sont locales. Si vous en créez un, personne d'autre que vous ne saura que votre table temporaire existe. Dans Oracle, la création de la table temporaire permet à tout le monde (ainsi qu'à tous ceux qui ont accès à votre schéma) de voir la table. Lorsque vous vous déconnectez de votre session, la table SQL-Server est supprimée et doit être recréée pour la session suivante. Dans Oracle, la table temporaire fait désormais partie intégrante de votre schéma, même si les données ne le sont pas (sinon, vous pouvez décider de les conserver ou non). Oracle ne prend en charge que la table temporaire globale, ce qui vous évite de devoir créer la table à chaque session; il "existe" mais il est vide et son contenu est unique (et privé) par session.

7
Joby Thomas

Sachez qu'aucune statistique n'est associée à une table temporaire globale. Vérifiez donc si le niveau d'échantillonnage dynamique de l'instance doit être défini pour vous assurer que les tables non analysées sont échantillonnées au moment de l'analyse. Sinon, l'heuristique peut conduire à un mauvais plan d'exécution.

6
David Aldridge

De plus, les tables temporaires Oracle (globales) sont very utiles lorsque chacun de vos utilisateurs/sessions doit voir un ensemble de données différent. Il suffit d'insérer les enregistrements dans votre table temporaire globale et de laisser Oracle gérer le maintien d'un ensemble d'utilisateurs d'un autre, ainsi que le nettoyage. Vous n'avez pas besoin de les interroger avec l'ID de l'utilisateur, un identifiant de session ou autre.

Nous les trouvons très utiles.

2
Stew S

Pour ajouter des éléments aux réponses existantes concernant les tables temporaires locales et globales, à partir de Oracle 18c, il y aura véritablement "Tables temporaires privées" :

Les tables temporaires privées sont des objets de base de données temporaires qui sont automatiquement supprimés à la fin d'une transaction ou d'une session. Une table temporaire privée est stockée en mémoire et n'est visible que par la session qui l'a créée.

Une table temporaire privée limite la portée d'une table temporaire à une session ou à une transaction, offrant ainsi plus de souplesse dans le codage des applications, facilitant ainsi la maintenance du code et une meilleure fonctionnalité, prête à l'emploi.

Démo de Oracle Live SQL: tables temporaires privées 18c :

-- Private temporary tables must be prefixed as per the database parameter 
-- 'private_temp_table_prefix' 

create private temporary table ORA$PTT_MY_TT ( x int );

-- The table is truly private. 
-- It does not even exist in the the data dictionary, only your session 

-- By default, the moment you commit, the table ceases to exist 
commit;

select * from ORA$PTT_MY_TT;
-- ORA-00942: table or view does not exist

-- This can be changed by specifying that the definition should be preserved 
create private temporary table ORA$PTT_MY_TT ( x int )  
on commit preserve definition;

insert into ORA$PTT_MY_TT  
select rownum from dual  
connect by level <= 30;

commit;

select count(*) from ORA$PTT_MY_TT;
-- 30 

db <> fiddle demo

2
Lukasz Szozda

Il n'y a pas de table temporaire, seulement une table temporaire globale . L'idée d'une table temporaire globale est que la définition existe et peut être vue de tous, mais les données sont privées pour chaque session. Vous pouvez également configurer si les données sont nettoyées lors de la validation ou uniquement à la fin de la session.

0
Nisar