Merhabalar arkadaşlar, Sitemizi programlama ile ilgilenen bütün arkadaşlarımızın türkçe içerik konusunda çektiği sıkıntılar düşünülerek soru/cevap şeklinde bir etkileşimde bulunabilmesi için kurduk. Umuyoruz hepimiz için güzel bir deneyim olur. Hasscript Ekibi

Sorunuz mu var? Belki de çoktan soruldu..

0
Oracle veri tabanında bir tablonun boyutunu (size) nasıl bulurum?

Çözüldü 2 Cevaplar 26 Gösterim Veri Tabanı
oracle veri tabanım var. Bazı büyük tablolarımın boyutlarını dump almadan query ile çekip görmek istiyorum.

Nasıl bir komut kullanmalıyım?

2 Cevap

2
En İyi Cevap

Aşağıdaki sorgu ile bir şemaya ait tüm tabloların boyutlarını görebilirsiniz.

with IND as (select /* materialize */  table_owner,table_name, s.segment_name ,sum (bytes) ind_bytes  from dba_Segments s,dba_indexes x 
where s.segment_type like 'INDEX%' and s.owner = '&&owner'
and   s.owner=x.owner 
and   s.segment_name=x.index_name
group by table_owner,table_name, s.segment_name),
TAB as ( select /* materialize */  owner,segment_name,count(*) adet ,sum(bytes) tab_bytes  from dba_segments 
where segment_type in ('TABLE','TABLE PARTITION','TABLE SUBPARTITION') and owner = '&owner' 
group by  owner,segment_name),
SUMS as (select /* materialize*/ sum(bytes) sum_bytes from dba_segments ),
LOBS as (select /*+ RULE*/ s.owner,l.table_name, sum(bytes) lob_bytes  from dba_lobs  L, dba_segments s
 where l.owner=s.owner
 and s.segment_name=l.segment_name 
 and l.owner = '&owner'
  group by s.owner,l.table_name)
select owner,segment_name,adet part, round(data_bytes/1024/1024/1024) data_size_GB ,
       round(nvl(index_bytes,0)/1024/1024/1024) index_size_GB,
       round(nvl(lob_bytes,0)/1024/1024/1024) lob_size_GB,
       round((data_bytes+nvl(index_bytes,0) +nvl(lob_bytes,0) )/1024/1024/1024) total_GB,
       round(((data_bytes+nvl(index_bytes,0)+nvl(lob_bytes,0) )/sum_bytes)*100) PCT
from 
(select t.owner,t.segment_name,t.adet,tab_bytes data_bytes, lob_bytes ,sum(ind_bytes) index_bytes 
from tab t, ind i, lobs b   
where t.owner=i.table_owner(+)
and t.segment_name=i.table_name(+)
and t.owner=b.owner(+)
and t.segment_name=b.table_name(+)
group by t.owner,t.segment_name,t.adet,tab_bytes, lob_bytes
order by tab_bytes+nvl(index_bytes,0)+nvl(lob_bytes,0) desc ),sums;
10 Ocak buzel (551 puan) cevapladı
10 Ocak kenan seçti
1
Selam,

Aşağıdaki sql yardımcı olabilir;

select segment_name,

segment_type,

bytes/1024/1024 MB
 from dba_segments
 where segment_type='TABLE' and segment_name='Tablo Adı';
5 Ocak erkanerkisi (187 puan) cevapladı
3Yorumlar
5 Ocak tolga (1,619 puan) yorumladı
dba_segment objesine (tablo/view) yetkiler sınırlandırılmış kullandığım canlı ortam olduğu için. bunu yapmanın başka bir yolu olabilir mi :S
10 Ocak buzel (551 puan) yorumladı
ya yetki almalısınız ya da yetkisi olan birinden (dba'den vs.) istemelisiniz.
10 Ocak buzel (551 puan) yorumladı
10 Ocak buzel düzenledi
tablo'ya ait indexleri, lob alanları, partition'ları, subpartitionları da dahil etmelisiniz. segment_type='TABLE' yeterli olmaz.  aşağıda bir sorgu paylaştım, sık kullandığım bir scripttir. işinize yarayacaktır.
...