by 아까걔 [SQL Query] join oracle [2016.06.15 19:21:07]
dba_data_files와 dba_free_space 를 join하여 테이블스페이스 전체용량과 여유공간을 동시에 얻으려고 합니다.
select tablespace_name, sum(byte/1024/1024)
from dba_data_files
group by tablespace_name
order by 1;
위처럼 dba_data_files만 쿼리를 해보면 값이
TABLESPACE_NAME SUM(BYTES/1024/1024)
------------------------------ --------------------
EXAMPLE 346.25
SYSAUX 630
SYSTEM 750
UNDOTBS1 85
USERS 5
이렇게 나오구요. ( 원래는 이렇게 나와야 정상인 걸로 알고 있습니다.)
dba_free_space도
SQL> select tablespace_name, sum(bytes/1024/1024)
2 from dba_free_space
3 group by tablespace_name
4 order by 1;
TABLESPACE_NAME SUM(BYTES/1024/1024)
------------------------------ --------------------
EXAMPLE 36.0625
SYSAUX 35.375
SYSTEM 1.0625
UNDOTBS1 71.625
USERS .875
원래는 이 값이 나와야 할텐데 , 이 두 테이블을 제 생각대로 join해보니까 값이 이상하게 나옵니다.
select A.tablespace_name, sum(A.bytes/1024/1024) "bytesMB", sum(B.bytes/1024/1024) "freeMB", sum(round(B.bytes/A.bytes*100,2)) "(%)"
from dba_data_files A, dba_free_space B
where A.tablespace_name=B.tablespace_name(+)
group by A.tablespace_name, B.tablespace_name
order by 1;
이렇게 입력하였더니 값이
TABLESPACE_NAME bytesMB freeMB (%)
------------------------------ ---------- ---------- ----------
EXAMPLE 1038.75 36.0625 10.41
SYSAUX 1260 35.375 5.62
SYSTEM 1500 1.0625 .14
UNDOTBS1 1020 71.625 84.26
USERS 5 .875 17.5
dba_free_space에 있는 bytes 칼럼 값은 값이 맞게 나오는데, dba_data_files에 있는 bytes 칼럼의 값이 이상하게 나옵니다.
example은 3배, sysaux는 2배 등등 값이 배수 단위로 나오네요.
어디서 쿼리가 잘못된건가요?
-> 인라인뷰 사용
select A.tablespace_name, A.bytesMB bytesMB, B.freeMB freeMB from (select tablespace_name, sum(byte/1024/1024) bytesMB from dba_data_files group by tablespace_name) A, (select tablespace_name, sum(bytes/1024/1024) freeMB from dba_free_space group by tablespace_name) B where A.tablespace_name = B.tablespace_name(+) order by 1;