TABLE etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
TABLE etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

27 Şubat 2012 Pazartesi

Tabloların taşınılması işlemleri



 Senaryo gereği iki tane birbiri ile ilişkili(master-child yapıda) tablolardan birisini başka bir tablespace’ ni değiştirdiğimizde tabloyla ilişkili nesnelerin (index-constraint) durumlarını inceleyelim.

Öncelikle veritabanımıza bazı yeni kullanıcı, tablespace oluşturmak için Sqlplus’ a sysdba olarak bağlanalım.


sqlplus / as sysdba
Connected.

Create a tablespace(bir test tablespace oluşturalım)
create tablespace test_tbs datafile
'/u01/app/oracle/oradata/XDB/datafile/test01.dbf' size 10M  autoextend on next 1M;
 
Tablespace created

İkinci bir tablespace oluşturuyorum.

create tablespace test_tbs2 datafile
'/u01/app/oracle/oradata/XDB/datafile/test02.dbf' size 10M  autoextend on next 1M;

Tablespace created.

Create a user(bir  test kullanıcısı oluşturalım)

create user test_usr identified by password;
 
User created.

Daha sonra test_usr kullanıcısına gerekli haklar verelim.

grant resource,connect to test_usr;

Grant succeeded.

Bu kullanıcıya Default tablespace ve geçici tablespace  olarak belirleyelim. Bundaki amaç bu kullanıcının oluşturacağı tablolar ve diğer nesneler default olarak bu tablespace içinde yer alması içindir.

alter user test_usr default tablespace test_tbs temporary tablespace temp;

User altered.

conn test_usr/password
Connected.

Tablo oluştur.
create table
test_table( t_id number, t_name varchar(30), hire_date date );

Table created.

Bildiğimiz gibi oracle diğer veritabanlarında olduğu gibi otomatik artan bir veritipine sahip değildir. Bu amaçla oracle nesnesi olarak sequence oluşturulup tablo kayıtları için kullanılabilir. Böylelikle de sequence nesnesinin de nasıl oluşturulup , tablo üzerinde nasıl kullanacağımızı da pekiştirmiş oluruz.

idmatic isminde bir Sequence oluştur.

create sequence id_matic
                        minvalue 1 
                        maxvalue 100
                        increment by 1
                        start with 1
                        nocycle 
sequence created.

insert into test_table  values(id_matic.nextval,'John',sysdate-30);

1 row created.

insert into test_table values(id_matic.nextval,'Jim',sysdate-60);

1 row created

insert into test_table values(id_matic.nextval,'Austin',sysdate-90);

1 row created.


select * from test_table;
      T_ID T_NAME                         HIRE_DATE
---------- ------------------------------ ----------
         2 John                           20/01/2012
         3 Jim                            21/12/2011
         4 Austin                         21/11/2011

Diğer child tabloyu oluşturuyoruz.

create table test_child_table(id number,month varchar(20),salary number);

Table created

Diğer parent tablo (test_table) ile ilişkiyi sağlamak için bu tabloya bir foreign key tanımlıyorum.

alter table test_child_table add constraint fk_id_test_ch_tbl foreign key(id)
references test_table(t_id);

Table altered

Daha sonrada indeks testi için bu child tablo üzerinde bir indeks oluşturuyorum. Btree indeksler de oluşturabilirsiniz. Ben Bitmap indeks tercih ettim.
create bitmap index idx_id_child_tbl on test_child_table (id);

Index created.

Yeni kayıt girelim
 insert into test_child_table values(2,'JAN',2000); 

1 row created

Kullanıcı tablolarını bir sorgulayalım. Bakalım ne yapmışız.

select table_name,tablespace_name from user_tables;
TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
TEST_TABLE                            TEST_TBS
TEST_CHILD_TABLE               TEST_TBS

Test_usr kullanıcısına it user objeleri aşağıda görülmektedir.


select object_name,OBJECT_TYPE from all_objects where owner='TEST_USR';


OBJECT_NAME                    OBJECT_TYPE
------------------------------ -------------------
ID_MATIC                       SEQUENCE
TEST_TABLE                     TABLE
PK_T_ID_TEST_TBL               INDEX
TEST_CHILD_TABLE               TABLE

Daha sonra test_child_table tablosunu test_tbs2 tablespace’ ine taşıyoruz.


alter table test_child_table move tablespace test_tbs2; 
Table altered.


Tekrar kontrol ettiğimizde kullanıcı tablolarını test_child_table tablosunu farklı bir tablespace taşıdığımızı kontrol ettik. Problem yok.

select table_name,tablespace_name from user_tables;
TABLE_NAME                           TABLESPACE_NAME
------------------------------ ------------------------------
TEST_TABLE                          TEST_TBS
TEST_CHILD_TABLE                          TEST_TBS2

Bakalım şimdi bu tablo üzerindeki nesneler özellikle indeksler ne durumda diye.
Taşındıktan sonra test_child_table tablosu üzerindeki indeksler unusable(kullanılamaz) hale gelecektir.;

 select index_name,status from user_indexes where table_name='TEST_CHILD_TABLE';

INDEX_NAME                     STATUS
------------------------------ --------
IDX_ID_CHILD_TBL               UNUSABLE

Gördüğümüz gibi tablo taşındıktan sonra mevcut indeksin tablo kayıtları için tuttuğu rowid ‘ler de değiştiği için indeks te artık yeni rowidler mevcut olmadığından unusable duruma düşecektir. Neyseki  rebuild edilebilir özelliği olduğundan yeni tablespace üzerinde rebuild edip yeni row id leri  listesine alacaktır.
Daha sonra bu indeksi yeni  yerinde rebuild yapma ihtiyacımız olacaktır.


 alter index IDX_ID_CHILD_TBL rebuild tablespace test_tbs2 ;

Index altered.

select index_name,status from user_indexes where table_name='TEST_CHILD_TABLE';



INDEX_NAME                     STATUS
------------------------------ --------
IDX_ID_CHILD_TBL               VALID

Şimdi bakalım. Bildiğimiz gibi test_child_table tablosu test_table tablosuna bağımlı bir child tablodur. Yeni yerinde test_child_table tablosuna yeni kayıtlar ekleyelim.

 insert into test_child_table values(3,'FEB',4000);

1 row created.

select * from test_child_table;

        ID MONTH                    SALARY
---------- -------------------- ----------
         2 FEB                        4000
         3 FEB                        4000
Ana tablomuzdak kayıtları inceleyelim.

select * from test_table;


      T_ID T_NAME                         HIRE_DATE
---------- ------------------------------ ----------
         2 John                           20/01/2012
         3 Jim                            21/12/2011
         4 Austin                         21/11/2011

insert into test_child_table values(1,'FEB',4000);

insert into test_child_table values(1,'FEB',4000)

ERROR at line 1:
butunluk kısıtlaması (TEST_USR.FK_ID_TEST_CH_TBL) bozuldu – ust anahtar
bulunamadi


Tabloyu taşıdık. Ama Ana tabloya bağımlı olan bir foreign key kısıtlaması halen çalışmakta.
Farklı bir makale ile görüşmek üzere.

26 Aralık 2011 Pazartesi

Heap Organized Table Ve Index Organized Table



Üç tür tablo çeşiti vardır.
Bunlar;
       Heap organization table
       Index organization table
       External organization table  
Biz burada sadece HOT ve IOT indeks yapılarını analiz edeceğiz. Ve karşılaştırmasını yapacağız.
Öncelikle  team tablosu oluşturacağız. Heap organized table’da Create cümlesinin sonunda “organization Heap” demeye gerek yoktur. Yazmadığımız zaman da bu HOT table olur. Default olarak tüm tablolar HOT’dur.




Sorgunun çalıştırılmasında kullanılan execution planda sorgunun erişiminde Index rowid’si kullanılmıştır. Yani indeks segmentindeki kayıtlı index bloğu kullanılmıştır.
Aşağıdaki tabloda HOT(heap organization table) ‘un index yapsını şeması vardır. Yani bir index segmenti içerisindeki index tablosundaki index bloğunun yapısını anlatmaktadır. 2 byte Row header’ a sahiptir ve 6 byte row id adresi tutulur.





HOT tablolarda ise table blok yapısı aşağıdaki gibidir. 3 byte Row Header’ a sahiptir.




Örnek bir IOT tablolardaki index yapısı aşağıdaki gibidir.





  •          Burada sadece bir index row header’a sahiptir. Index  uzunuluğu 3 karakter ve bilgisi FER dir.IOT için , Create table ifadesinden sonunda Organization Index zorundayız. Fiziksel table Rowid lerdetutulmazlar ,index Rowidlerde tutulur.
  •         IOT’ lar ayrı bir Table segmentine ihtiyaç duymaz. Primary Key  Constrainti almak zorundadır. İndex segment ismi primary key Constraint’ine bağlıdır.ismini oradan alır.( SYS_IOT_TOP_<object_id>)
  •          IOT’ lar LONG türünde kolonlar içermezler. Reversed index olamazlar. Yerden tasarruf sağlamak için sıkıştırılabilirler.
  •          IOT Tablolarda eğer primary key kolonu ilk sırada tanımlanmamışsa oracle bu yapıyı tekrardan bir reorder yapacaktır.

IOT Overflow table:

  • Çok büyük satırları IOT’ larda tutmak verimsiz bir davranıştır. Bu yüzden bu tür satırları overflow segmentinde saklamak daha mantıklıdır.
  •   Primary key  satırları indeks segmentinde bulunur. Non-key olan satırlar indeks  segmenti yada  overflow segmentinde bulunur. 
  • Overflow segmenti ilave extra bir table segmentidir. Bir indeks overflow için  row 6 byte Rowid içerir.

Aşağıda örnek bir IOT overflow index bloğu verilmiştir.
d

Karşılaştırma:
HOT ve IOT'u karşılaştıracak olursak daha az leaf kullancağından bilginin aranıp bulunması daha kısa sürer.
           



        


Resim Kaynakları: Julian Dyke