TURKCELL de staj

http://www.turkcell.com.tr/site/tr/turkcellhakkinda/Sayfalar/insan-kaynaklari/Paf-Takimi.aspx

——————————————

Staj süreci özellikle lisans öğrenimini sürdüren öğrenciler için oldukça önemli bir dönem.İş hayatı ile ilk tanışmaların  olduğu , iş süreçleri ve gerçek iş hayatı ile ilgili önemli tecrübelerin kazanılabileceği önemli bir dönem.Tabi bu kazanımlar için öncelikle bunları sağlayabilecek bir işveren-firma- ve buna hazır bir staj adayı gerek:)

Staj adayı bulmakta bir sıkıntı olacağını zannetmiyorum.Önemli olan staj yapabilecek , stajere ve staj dönemine gereken önemi gösteren ciddi firmalar bulmak.Bu konuda 4 senedir çalıştıgım TURKCELL de  önemli çalışmalar yapılıyor.Hasan Tonguç Yılmaz abimizin öncülüğünde R&D Software Development bölümünde aday stajerler arasında seçimler yapılarak TURKCELL de staja hak kazanıyorlar.Verilen görevleri , ödevleri, çalışmaları vs. özetle isteneni en iyi şekilde yapan aday stajer arkadaşlar yaz döneminde 3 aylık TURKCELL stajına hak kazanıyorlar.

Peki hangi konularda ve içerik nasıl? TURKCELL, Java ve Oracle teknolojilerinin yoğun olarak kullanıldığı bir yer.Böyle olunca da staj çalışmaları bu konular üzerine oluyor.Özellikle Oracle konusunda 3 aylık staj dönemi planlanıyor, öncelikle başta Hasan Tonguç Yılmaz olmak üzere gönüllü çalışanlar (bende katkıda bulunmaya çalışıyorum) stajerlere yoğun bir Oracle sunum programı uyguluyor.İlerleyen zamanlarda da stajer arkadaşlar bu sunumlara konular alıp çalışarak, sunumlar hazırlayarak katkıda bulunuyorlar.Bunlar teori ile de kalmıyor.Stajer arkadasların bulundugu bölümlerde mümkün oldugu kadar işler verilerek ögrendiklerini pratiğe dökme imkanı sağlanıyor.Bana sorarsanız hiç bir sey yapılmasa bile 3 ay süresince yapılan Oracle sunumlarına katılsanız bayağı bir mesafe katedeceğize inanıyorum.Bu Oracle yiyip bitirme anlamna gelmiyor tabi:) “Oracle’ı anlama, tanıma ” anlamında düşünün bu yazdıklarımı.Çünkü Oracle hakkaten bir derya.

Bu konuda

http://tonguc.wordpress.com/2007/07/16/turkcell-rd-software-development-internship-2007-started/

adresini ziyaret etmenizi de öneririm.

İyi çalışmalar diliyorum….

ROWTYPE kullanarak satır update etme ve kolonlarda DEFAULT anahtar kelimesi

ROWTYPE’ı  PL/SQL kodlarımızda sıkça kullanırız.Bununla, yapısı tablonun bir satırı şeklinde olan bir type tanımlamış oluruz.Kısaca hatırlatmak gerekirse; Örneğin TTT tablosu ID ve DESCR alanlarından oluşuyor ise

a_row TTT%rowtype;

tanımladıgımızda “a_row” artık TTT tablosunun satırı tipinde bir değişkendir.Bu satır değişkenini kolonlarına! ”a_row.ID” ve “a_row.DESCR” seklinde ulaşbiliriz.Şimdi asıl konumuza geçelim.

Bu tipte bir değişkenimiz varsa ve değerleri girmiş isek bir satırı update ederken her bir kolon için tek tek “set …, …, …” kullanmamıza gerek yoktur.”…set row = row_type ..” demeniz yeterlidir.Örnek yapalım :

create table ttest nologging as
select object_id, object_name, object_type from user_objects
where rownum <= 10;

Diyelimki minimum object_id verisinde UPDATE yapacağız.Hangisiymiş bulalım 

select min(object_id) from ttest;

min(object_id) 
3

declare
ttest_row ttest%rowtype;
begin
  ttest_row.object_id := 111;
  ttest_row.object_name := ‘XXX’;
  ttest_row.object_type := ‘???’;
  update ttest set row = ttest_row where object_id = 3;
  commit;
end;

Kontrol edelim :

select * from ttest where object_id = 111
object_id  object_name   object_type
111            XXX                 ???

Diğer bir konuda DEFUALT anahtar kelimesinin kolonlardaki kullanımına dair.Tabloda insert ya da update yaparken kolonun varsayılan değerini kullanmak isteyebilirz.Örnek olarak yukarıda oluşturduğumuz TTEST tablosunun “object_type” kolonuna varsayılan değer olarak ‘NEW_TYPE’ atayalım ve akabinde insert-update ile kullanalım :

SQL> alter table ttest modify object_type default ‘NEW_TYPE’;Table altered.

::: insert Örneği :::

SQL> insert into ttest values(999,’A_TABLE’, default);1 row created.SQL>
SQL> select * from ttest where object_id  = 999;
OBJECT_ID  OBJECT_NAME   OBJECT_TYPE
999               A_TABLE             NEW_TYPE

::: UPDATE örneği :::

SQL> update ttest set object_type = default where object_id = (select min(object_id) from ttest);1 row updated.SQL>
SQL> select * from ttest where object_id = (select min(object_id) from ttest);

OBJECT_ID   OBJECT_NAME   OBJECT_TYPE
15                 UNDO$                   NEW_TYPE

Indeks i kullandırabilmek için “şunu yapma bunu yap” türünden tavsiyeler ÖZET

Üzerinde indeks olan kolonlarda optimizer ın indeksi kullanabilmesi için temel bazı tavsiyeler

Bunlar YAPILMAMALI

1) … where first_name || last_name = ‘HAKKIOKTAY’
2) … where counter != 0;
3) … where trunc(process_date) = trunc(sysdate);
4) … where salary + 100 < 1000;
5) … where substr(last_name,1,3) = ‘OKT’

Yukarıdakilerin yerine şunlar tercih edilmeli

1) … where first_name = ‘HAKKI’ and last_name = ‘OKTAY’ ;
2) … where counter > 0 ;
3) … where process_date between trunc(sysdate) and trunc(sysdate) + .99999;
4) … where salary < 900;
5) … where last_name like ‘OKT%’;

Ayrica Indeksler hakkında  daha önceden yazdığım yazılara bakmanız faydalı olabilir.

i den j ye kadar olan kayıtların getirilmesi

En sık karşılaşılan isteklerden bir tanesi de okudugumuz kayıtlar arasında istenilen kadarını ya da belli kayıttan yine belli kayıtlar arasında olanları görmektir.Bunu sağlarken ROWNUM dan faydalanırız.Basit bir örnek yapalım.Bunun icin herkeste bulunan all_objects tablosundan 10 adet kayıt cekip TTEST tablosunu
oluşturalım :

create table ttest nologging as
select object_id, object_name from all_objects
where owner = ‘HR’
and    object_type = ‘TABLE’
and    rownum <= 10
order by object_id

Aşağıdaki sorgu ile 10 kayıtlık tablomuzdaki [1-5] arası kayıtları sonraki ile de [6-10] arası kayıtları getirebiliriz.

select * from
    (select TTABLE.*, rownum row_num from
      ( select /*+ FIRST_ROWS */ * from ttest ) TTABLE
    where rownum <= 5 )
where  row_num > 0

OBJECT_ID  OBJECT_NAME  ROW_NUM

12088            REGIONS           1
12090            COUNTRIES       2
12092            LOCATIONS       3
12095            DEPARTMENTS  4
12098           JOBS                 5

select * from
    (select TTABLE.*, rownum row_num from
      ( select /*+ FIRST_ROWS */ * from ttest ) TTABLE
    where rownum <= 10 )
where  row_num > 5 ;

OBJECT_ID   OBJECT_NAME  ROW_NUM
12100            EMPLOYEES         6
12104            JOB_HISTORY      7
13645            DEMO_IMAGES    8
13647            DEMO_USERS     9
13652            DEMO_CUSTOMERS 10

 

DDL işlemleri AUTOCOMMIT tir.Gerçekleştirilemese de!

Bilindigi üzere DDL işlemleri (ALTER, CREATE vs..) gerçekleştirilmeden evvel COMMIT işlemi gerçektirilir.Ancak genel yanılgı DDL in basarili olmasi durumunda COMMIT gerçekleşir gibi bir izlenim olmasıdır.Yani başarılı bir şekilde sonlamasına gerek yoktur.DDL çalıştırılma akışı aşağıdaki gibidir :

begin
   [commit]
   [DDL parse edilir]
begin
   [DDL çalıştırılır]
   commit;
exception
   when Others Then rollback;
end;
end;

Şimdide bunu basit bir senaryo ile görelim.

 ::: SESSION 1 :::SQL> create table TTEST (name varchar2(15), ddate date);Table created.SQL> insert into ttest select ‘alperen-ahmet’, sysdate from dual;1 row created.SQL>
SQL> commit;
Commit complete.SQL> insert into ttest values(’Hakki’, sysdate);1 row created.

Burada COMMIT yapmadan hemen diğer session a geçelim.

::: SESSION 2 :::SQL> select * from ttest;NAME            DDATE
————— ———
alperen-ahmet   22-FEB-07
SQL>

 ::: SESSION 1 :::

SQL> insert into ttest values(’Hakki’, sysdate);1 row created.SQL> create table TTEST as select * from all_objects where 1=2;
create table TTEST as select * from all_objects where 1=2
             *
ERROR at line 1:
ORA-00955: name is already used by an existing object


DDL işlemimizde bir HATA aldık , COMMIT demedik.Diger session dan tabloya bakalım

::: SESSION 2 :::

SQL> select * from ttest;NAME            DDATE
————— ———
alperen-ahmet   22-FEB-07
Hakki               22-FEB-07

Görüldüğü üzere ilk sessionda bilinçli şekilde COMMIT yapmadıgımız halde 2.session ekledigimiz satırı gördük.Halbuki DDL düzgün sonlanmamıştı!Alınacak ders transaction lar içersine DDL işlemi konulmamalıdır.DDL bir şekilde çalışmasa bile transaction akışınızı kırabilir , istenmeyen sonuçlara yol açar.

 

Clustering Faktor(CF) nedir?

Kabaca ; indeks üzerinden tabloya gidildiğinde ,her gidişte okunan tablo bloklarının sayısıdır.Arka arkaya aynı bloktan okuma yapılırken CF degeri arttırılmaz.Ne zamanki farklı bloga geçildi ,değeri o zaman bir arttırılır.Peki bundan bize ne:) Aslında bayağı ilgili olmamız gereken bir bilgi.Çünkü verilere ulaşırken tablonun ne kadar bloğu üzerinde gezineceğimiz (I/O) ortaya çıkıyor.Ne kadar çok blok okuma o kadar COST = maliyet.Bu da execution planı etkilemektedir.

Daha iyi ifade etmek için aşağıdaki gibi bir örnek yapalım.Tablomuz aşağıdaki gibi değerlerden oluşsun ve satırlar 3 bloğa dağılmış olsun.

  DESCR          ID DESCR     ID DESCR
  1 “bir”          4 “dört”        7 “yedi”
  2 “iki”           5 “beş”         8 “sekiz”
  3 “üç”          6 “altı”          9 “dokuz”

  Block1           Block2           Block3

 “ID” kolonu uzerinde indeksimiz oldugunu ve indeks üzerinden cift ID lerin DESCR kolon değerine ulasmaya çalıştığımızı düşünelim.

Indeksten tabloya hareket                 CF adedi (kümülatif)
2 ye tabloda ulaşıldıgında                       1  (Block 1)
4 e tabloda ulaşıldıgında                         2  (Block 2)
6 ya tabloda ulaşıldıgında                       2  (Block 2)
8 e tabloda ulaşıldığında                         3  (Block 3)

4 ve 6 aynı blokta oldugu için 2. adımdan 3. adıma geçerken CF değeri artmadı.Sonuç olarak CF değeri tablodaki blok sayısı kadar oldu.Bir başka değişle çift degerleri almak için tablodaki tüm blokları ziyaret ettik! (COST = Maliyet)

Tablo yapımız aşağıdaki gibi olsaydı CF “1” olacaktı. Başka bir değişle Cost = maliyet daha az olurdu. 

DESCR          ID DESCR
 1 “bir”          2 “iki”
 3 “üç”          4 “dört”
 5 “beş”         6 “altı”
 7 “yedi”        8 “sekiz”
 9 “dokuz”

Şimdi bu abnatılanları gerçek dünyada görelim. TTEST tablomuzu ve bu tablo üzerinde indeksi oluşturalım :

 SQL> create table TTEST as select * from all_objects order by object_id;
Table created.
 SQL> create index TTEST_ID_IDX on TTEST(object_id);
 Index created.

İstatistik toplamayı unutmuyoruz.

SQL> analyze table TTEST compute statistics for all indexes;Table analyzed.

Şimdide aşağıdaki sorgu ile tablodaki blok adedi ve CF değerini görelim :

 SQL> select t.blocks table_blocks, i.clustering_factor CF
  2  from   dba_tables t, dba_indexes i
  3  where t.table_name=i.table_name
  4  and    t.table_name=’TTEST’
  5  and    t.owner = ‘TEST’;
 
TABLE_BLOCKS         CF
———— —————-
       33816             157

Tablomuzu biraz karıştıralım.Bunu için tablomuza aşağıdaki gibi verilerei girelim :

SQL> insert into ttest select * from all_objects order by object_type;
11797 rows created.

İstatistiğimizi toplayalım.

SQL> analyze table TTEST compute statistics for all indexes;
Table analyzed.

Tablodaki blok adedi ve CF değerini yeniden görelim :

SQL> select t.blocks table_blocks, i.clustering_factor CF
  2  from   dba_tables t, dba_indexes i
  3  where t.table_name=i.table_name
  4  and    t.table_name=’TTEST’
  5  and    t.owner = ‘TEST’;
 

TABLE_BLOCKS         CF
———— ——————
33816             22912

CF oldukça arttı.Bunun olası bir maliyetide beraberinde getireceğini artık farkındayız.

Peki CF degerini nasıl düşürebiliriz?Akla gelen ilk yol tabloyu yeniden organize etmektir.Bunu da 10g ile gelen shrink opsiyonu ile gerçekleştirebiliriz.Ancak SHRINK kullanabilmek için tablespace’in ASSM modda  olması gerektigini unutmayalım. Bazende çok DML görmüş bir tabloyu (özellikle sık update ,delete) yeniden oluşturmak iyi olabilir.

  

NULL = NULL mıdır?

Çokça kullandıgımız bir ifadedir NULL ve çoğu zaman basit ama ince bir noktayı gözden kaçırabiliriz.NULL , veritabanının çoğu davranışı etkileyen , değiştiren bir değerdir.En başta söylenecek söz Oracle için “NULL = NULL değildir” olmalıdır.

Bunu hemen örnekle görelim.

create table ttest (id number(1), descr varchar2(10));

declare
begin
  insert into ttest values(1, ‘bir’);
  insert into ttest values(2, ‘iki’);
  insert into ttest values(3, NULL);
  commit;
end;

select * from ttest where descr = null;

No rows returned

Son sorgumuzda satır dönmediğini göreceğiz.Halbuki id = 3 için descr alanı NULL idi.

select * from ttest where descr <> null;

No rows returned

Yukaridaki sorguda ise “NULL dan farklı olanları getir” diyoruz ama yine hiç satır gelmiyor.

Peki NULL kontrolünü nasıl yapacağız? NULL mı değil mi kontrolu “IS NULL” ya da “IS NOT NULL” şeklinde yapılmalıdır.

select * from ttest where descr is null;

select * from ttest where descr is not  null;

Kolon üzerinde NULL değer varsa ve indeks kullanıyorsak da dikkatli davranılmalı.”NULL = NULL değildir” koşuluna burada da dikkat.TTEST tablomuzda aşağıdaki uniqueu indeksi oluşturalım:

create unique index unq_ttest_idx on ttest(id, descr);

Şimdi “insert into ttest values(null,null);”  deneyelim.Başarılı olduğunu göreceğiz.

Sonra aynı insert ü tekrar yapalım : insert into ttest values(null,null);

Yine hata almayız.Çünkü NULL = NULL değildir.Öyle olsaydı 2. insertte ,oluşturduğumuz “uniqueu constraint” e takilirdik.TTEST tablosuna select ile baktığımızda 1den fazla (NULL,NULL) satırı görülecektir.

NOT : Evvelki yazılarda da bahsettim ama NULL indeksin kullanılıp kullanılmamasını da doğrudan etkiler.Buna da dikkat edelim.