2017-03-16 24 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選擇t1.tablespace_name,t1.mb/1024/1024,t2.segment_name(從dba_segments中選擇tablespace_name,max(BYTES)作爲mb,其中SEGMENT_TYPE ='TABLE'group by tablespace_name)t1 inner join dba_segments t2 on t1。 mb = t2.BYTES 其中t2.segment_type ='TABLE' – user3661564

回答

0

你可以把它縮短了當您使用FIRST功能:

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; 

注意,由於SEGMENT_TYPE = 'TABLE'您的查詢將不包括partitionized表。

另外需要注意的是,如果多個表的大小完全相同,則每個表空間只能有一個表。使用來自APC的解決方案,因爲您需要所有表格。

+0

這是美妙的解決方案什麼是MAX(SEGMENT_NAME)KEEP(DENSE_RANK最後的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函數。 –

相關問題