我創建了以下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
任何想法?
我創建了以下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
任何想法?
你可以把它縮短了當您使用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的解決方案,因爲您需要所有表格。
這是美妙的解決方案什麼是MAX(SEGMENT_NAME)KEEP(DENSE_RANK最後的ORDER BY BYTES)呢? – user3661564
該解決方案不會做你認爲它的工作。 MAX(SEGMENT_NAME)按字母順序返回最後一個段的名稱,而不是最大表的名稱。 – APC
@APC,我沒有寫max(segments_name),照顧「keep ...」表達式 –
使用解析函數排名表按大小順序:
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;
非常感謝你的解決方案.is rnk sql或pl/sql函數。 – user3661564
等級是pl/sql函數。 –
您在GROUP BY有TABLESPACE_NAME兩次。刪除後者。 – jarlh
感謝大家的快速回復。我找到解決方案我的自我,但也會檢查你的。 – user3661564
從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