2015-02-12 6 views
0

Я хотел бы написать sql, чтобы получить метрику памяти верхнего уровня таблицы. Ниже запрос дает метрику обо всех tbspaces. Цените, если кто-то точно настроить это, чтобы иметь только Top NOracle SQL Group по предложению

SELECT 
ts.tablespace_name AS TBNAME, 
round((ts.tablespace_size/1024/1024),2) AS SIZE_MB, 
round((ts.tablespace_used_size/1024/1024),2) AS USED_MB, 
round(((ts.tablespace_size - ts.tablespace_used_size)/1024/1024),2) AS  FREE_MB 
FROM 
mgmt$db_tablespaces ts, 
(SELECT d.target_guid, d.tablespace_name, count(d.file_name) df_count, 
sum(decode(d.autoextensible, 'YES', 1, 0)) auto_extend 
FROM mgmt$db_datafiles d, mgmt$target t 
WHERE t.target_guid = '<id>' AND 
(t.target_type='rac_database' OR 
(t.target_type='oracle_database' AND t.TYPE_QUALIFIER3 != 'RACINST')) AND 
t.target_guid = d.target_guid 
GROUP BY d.target_guid, d.tablespace_name) df 
WHERE 
ts.target_guid = df.target_guid AND 
df.tablespace_name = ts.tablespace_name 
ORDER BY ts.tablespace_size;` 

Благодарности

ответ

1

Вы можете использовать ROWNUM. Oracle применяет rownum к результату после его возврата. Вам нужно отфильтровать результат после его возврата, поэтому требуется подзапрос. Вы также можете использовать функцию RANK(), чтобы получить результаты Top-N.

SELECT 
     * 
    FROM 
     (
     SELECT 
      ts.tablespace_name AS TBNAME, 
      round((ts.tablespace_size/1024/1024),2) AS SIZE_MB, 
      round((ts.tablespace_used_size/1024/1024),2) AS USED_MB, 
      round(((ts.tablespace_size - ts.tablespace_used_size)/1024/1024),2) AS  FREE_MB 
     FROM 
      mgmt$db_tablespaces ts, 
      (SELECT d.target_guid, d.tablespace_name, count(d.file_name) df_count, 
       sum(decode(d.autoextensible, 'YES', 1, 0)) auto_extend 
      FROM mgmt$db_datafiles d, mgmt$target t 
      WHERE t.target_guid = '<id>' AND 
      (t.target_type='rac_database' OR 
      (t.target_type='oracle_database' AND t.TYPE_QUALIFIER3 != 'RACINST')) AND 
      t.target_guid = d.target_guid 
      GROUP BY d.target_guid, d.tablespace_name) df 
     WHERE 
     ts.target_guid = df.target_guid AND 
     df.tablespace_name = ts.tablespace_name 
     ORDER BY ts.tablespace_size 
    ) 
    WHERE ROWNUM <= 5; 
+0

Это не работает – Prakash

+2

Что вы подразумеваете под этим, не работает какая ошибка вы получаете? –

+0

это недействительный SQL. Я добавил RANK() и получил результат, который мне нужен. – Prakash

Смежные вопросы