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
0 oy
62 gösterim
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?
Veri Tabanı kategorisinde (1.6k puan) sordu

2 Cevap

+2 oy
 
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;
(567 puan) cevapladı
seçti
+1 oy
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ı';
(207 puan) cevapladı
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
ya yetki almalısınız ya da yetkisi olan birinden (dba'den vs.) istemelisiniz.
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.

İlgili sorular

0 oy
1 cevap 26 gösterim
0 oy
1 cevap 23 gösterim
0 oy
1 cevap 30 gösterim
0 oy
1 cevap 45 gösterim
...