8
votes

Taille de la vraie table à table en oracle

J'ai besoin de savoir TRUE taille de table à table à Oracle. J'ai quelques espaces de table et j'ai besoin de savoir combien d'espace il utilise maintenant et combien d'espace est gratuit (et peut-être pour cent d'espace libre). J'ai trouvé dans le Web des SQLS mais toutes ont tous montré une taille basée sur la marque de l'eau ... ce qui n'est pas un véritable espace alloué maintenant mais aussi loin que je connais la valeur la plus élevée qui a déjà été atteinte ... Donc, mon besoin réel est de savoir si j'ai assez d'espace pour mes données qui sont constamment écrites et que je dois savoir à quel point je peux stocker avant de devoir supprimer certains d'entre eux.

merci


0 commentaires

3 Réponses :


19
votes

Essayez ceci:

-- Available space, by tablespace

SELECT * FROM
  (SELECT tablespace_name FROM dba_tablespaces)
LEFT OUTER JOIN
  (SELECT tablespace_name, SUM(bytes) AS total_bytes
     FROM dba_data_files
     GROUP BY tablespace_name)
  USING (tablespace_name)
LEFT OUTER JOIN
  (SELECT tablespace_name, sum(bytes) AS used_bytes
     from dba_segments
     GROUP BY tablespace_name)
  USING (tablespace_name)
LEFT OUTER JOIN
  (SELECT tablespace_name, SUM(bytes) AS free_bytes
     FROM dba_free_space
     GROUP BY tablespace_name)
  USING (tablespace_name);


2 commentaires

Merci beaucoup!!! Je peux confirmer que cela fonctionne :) Peut-être que je devrais vous inscrire et voter pour votre réponse, car il résout un problème que j'ai trouvé très difficile pour beaucoup de gens et qui n'a pas de bonne réponse dans le Web ... Maintenant, il a :)


Notez que si des datafiles sont définis sur Autoextend et que les fichiers ne sont pas à leur taille maximale, cette réponse ne le prend pas. Il rapporte uniquement sur l'espace libre dans l'allocation actuelle uniquement.



5
votes

Si vous souhaitez avoir une idée de la taille du fichier de données, y compris ces fichiers pouvant accroître automatiquement, essayez:

SELECT DISTINCT a.tablespace_name,
            sum(a.bytes)/1024/1024 CurMb,
            sum(decode(b.maxextend, null, a.bytes/1024/1024, b.maxextend*(SELECT value FROM v$parameter WHERE name='db_block_size')/1024/1024)) MaxMb,
            round(100*(sum(a.bytes)/1024/1024 - round(c.free/1024/1024))/(sum(decode(b.maxextend, null, a.bytes/1024/1024, b.maxextend*(SELECT value FROM v$parameter WHERE name='db_block_size')/1024/1024)))) UPercent,
            (sum(a.bytes)/1024/1024 - round(c.free/1024/1024)) TotalUsed,
            (sum(decode(b.maxextend, null, a.bytes/1024/1024, b.maxextend*(SELECT value FROM v$parameter WHERE name='db_block_size')/1024/1024)) - (sum(a.bytes)/1024/1024 - round(c.Free/1024/1024))) TotalFree 
FROM dba_data_files a,
   sys.filext$ b,
   (SELECT d.tablespace_name , sum(nvl(c.bytes,0)) free
     FROM dba_tablespaces d,dba_free_space c
     WHERE d.tablespace_name = c.tablespace_name(+) 
     GROUP BY d.tablespace_name) c
WHERE a.file_id = b.file#(+)
    AND a.tablespace_name = c.tablespace_name  
GROUP BY a.tablespace_name,
       c.free/1024


0 commentaires

0
votes

Espérons que cela vous aiderait,

 SELECT a.tablespace_name, a.file_name, a.bytes allocated_bytes,b.free_bytes FROM dba_data_files a,
(SELECT file_id, SUM(bytes) free_bytes FROM dba_free_space b GROUP BY file_id) b WHERE a.file_id=b.file_id
ORDER BY a.tablespace_name;


0 commentaires