2017-03-16 20 views
0

次のSQL文を作成しますが、一般的に最も大きなテーブルを表示します。私は各表スペースについてそれを見たいと思う。Oracleの各テーブルスペースで最大のテーブルを見つける方法

select tablespace_name, max(BYTES/1024/1024), SEGMENT_NAME 
from dba_segments 
where SEGMENT_TYPE='TABLE' 
group by tablespace_name,SEGMENT_NAME,tablespace_name 

+0

あなたが二回GROUP BYでTABLESPACE_NAMEを持っています。後者を削除します。 – jarlh

+0

あなたの迅速な対応に感謝します。私は解決策を私の自己見つけるが、あなたもチェックします。 – user3661564

+0

t1.tablespace_name、t1.mb/1024/1024、t2.segment_nameを選択します。(select tablespace_name、max(BYTES)はdba_segmentsからmbになります(SEGMENT_TYPE = 'TABLE'グループby tablespace_name)t1 内部結合dba_segments t2 on t1。 mb = t2.BYTES ここで、t2.segment_type = 'TABLE' – user3661564

答えて

0

あなたがFIRST機能を使用するときは、それを短くすることができます:SEGMENT_TYPE = 'TABLE'による

SELECT tablespace_name, MAX(BYTES/1024/1024), 
    MAX(SEGMENT_NAME) KEEP (DENSE_RANK LAST ORDER BY BYTES) 
FROM dba_segments 
WHERE SEGMENT_TYPE = 'TABLE' 
GROUP BY tablespace_name; 

注意、あなたのクエリがpartitionizedテーブルは含まれません。

また、いくつかのテーブルがまったく同じサイズを持つ場合に備えて、テーブルスペースごとに1つのテーブルだけが得られます。すべてのテーブルが必要なため、APCのソリューションを使用してください。大きさの順にテーブルをランク付けする

+0

これはMAX(SEGMENT_NAME)KEEP(DENSE_RANK BY ORDER BY BYTES)とは何ですか? – user3661564

+0

解決策は、あなたが思っていることをしません。 MAX(SEGMENT_NAME)は、最も大きな表の名前ではなく、アルファベット順に最後のセグメントの名前を返します。 – APC

+0

@APC、max(segments_name)を書いておらず、 "keep ..."という式を扱いました –

0

使用分析機能:

SELECT 
    tablespace_name,segment_name,tab_size_mb 
FROM  
(
    SELECT 
    tablespace_name,segment_name,bytes/1024/1024 tab_size_mb, 
    RANK() OVER (PARTITION BY tablespace_name ORDER BY bytes DESC) AS rnk 
    FROM dba_segments 
    WHERE segment_type='TABLE' 
) 
WHERE rnk=1; 
+0

あなたのソリューション.is rnk sqlまたはpl/sql関数に感謝します。 – user3661564

+0

ランクはpl/sql関数です。 –

関連する問題