2010-02-05 18 views
7

J'ai besoin de connaître true taille de l'espace de table dans Oracle. J'ai quelques tablespace et j'ai besoin de savoir combien d'espace il utilise maintenant et combien d'espace est libre (et peut-être pour cent de l'espace libre). J'ai trouvé sur le web quelques sqls mais tous montraient une taille basée sur la marque d'eau ... ce qui n'est pas le vrai espace alloué maintenant mais pour autant que je connaisse la valeur la plus élevée jamais atteinte ... Donc mon vrai besoin est de savoir si j'ai suffisamment d'espace pour mes données qui sont constamment écrites et je dois savoir combien d'entre elles je peux stocker avant de devoir en effacer certaines.Taille réelle de l'espace de table dans Oracle

Merci

Répondre

19

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); 
+0

Merci beaucoup !!! Je peux confirmer que cela fonctionne :) Peut-être que je devrais m'inscrire et voter pour votre réponse parce qu'elle résout le problème que j'ai trouvé très dur pour beaucoup de gens et qui n'a pas bonne réponse dans le web ... maintenant il a :) – miki

4

Si vous voulez avoir une idée de la taille du fichier de données, y compris les fichiers qui peuvent automatiquement étendre ensuite essayer:

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

Espérons que ce vous aider,

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;