28 Ekim 2015 Çarşamba

Grub 2 Ayarları

Yöntem 1

Canlı cd ile makinanıza tekrar grub2 kurulumu yapmak istiyorsanız öncelikle sisteminizin sabit disk üzerindeki yerini öğrenmelisiniz:
sudo fdisk -l
Örneğimizde, bu alanın /dev/sda5 olduğunu kabul edelim.

Bölümümüzü sisteme bağlayalım:
sudo mount /dev/sda5 /mnt
Diğer bölümleri de sisteme ekleyelim:
sudo mount --bind /dev /mnt/dev
sudo mount --bind /dev/pts  /mnt/dev/pts
sudo mount --bind /proc /mnt/proc
sudo mount --bind /sys  /mnt/sys
Chroot ile kök dizinimizi değiştirelim:
sudo chroot /mnt
Artık grub2'mizi tekrar mbr üzerine yazabiliriz:
grub-install /dev/sda
Yazılıp yazılmadığını kontrol edin:
grub-install --recheck /dev/sda
Şayet hata vermediyse, işlem tamamdır.

Control+D tuşu ile chroot uygulamasından çıkıyoruz. Sırasıyla aşağıdaki komutları vererek sistemi yeniden başlatabilirsiniz:
sudo umount /mnt/dev/pts
sudo umount /mnt/dev
sudo umount /mnt/proc
sudo umount /mnt/sys
sudo umount /mnt
sudo reboot
Yöntem 2

Makinayı canlı cd ile açtıktan sonra kurulu bölümünüze çift tıklayarak sisteme bağlanmasını sağlayın veya elle kendiniz bağlayın. Çift tıklayarak bağladığınız zaman bağlama noktasını alttaki komutla öğrenin:
ls -l /media
Bağlama noktası disk bölümünün uuid değerine göre oluşacaktır. Buna uygun olarak komutu düzenleyerek grub2'yi mbr'ye yazdırın:
sudo grub-setup -d /media/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/boot/grub /dev/sda
Herhangi bir çıktı vermeden alt satıra geçiyorsa grub2'niz mbr'ye yazılmış demektir.

Yöntem 3

Yine makinayı canlı cd ile açtıktan sonra boot-repair uygulamasını kurup çalıştırmak yeterli:
sudo add-apt-repository ppa:yannubuntu/boot-repair
sudo apt-get update
sudo apt-get install boot-repair-ubuntu
sudo boot-repair
Not: Kurulu sistemi açtıktan sonra, şayet yeni kurduğunuz diğer işletim sistemi grub menüsüne yerleşmediyse grub menünüzü güncelleyin:
sudo update-grub

20 Ekim 2015 Salı

Oracle View Nedir? Simple view nedir ? Complex View nedir?

Oracle view Nedir?

view kullanımını bir örnekle kafamızda canlandırmaya çalışalım. Bir veritabanını yönetiyorsunuz farklı departmandaki arkadaşınıza maaş kolonunu, tablolardaki kolonların isimlerini direkt olarak göstermek istemiyorsunuz işte tam burada view karşımıza çıkıyor. View kelime anlamı olarak görünüm, görüntü demektir ve database de yer tutmazlar ilgili tablonun sorgusunu tutarlar.

View oluşturma 

Viewlerin genel hali aşağıdaki şekildedir.

CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view
[(alias[, alias]...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY [CONSTRAINT constraint]];

Simple View

  Basit Select sorguları ile oluşturulan viewe simple view diyebiliriz.
Evet bizde bir simple view oluşturup bu viewden select çekelim.

CREATE VIEW empview
AS SELECT employee_id, last_name, salary
FROM
employees
WHERE
department_id = 80;

view EMPVIEW created. uyarısını aldıysak işlem tamamdır.
 select * from empview; diyerek oluşturulan kısıtlamaları görebilirsiniz.
Evet View'ler üzerinden tablo bilgisi alabilir miyiz?
desc empview;

çalıştırdığımızda
Name        Null     Type        
----------- -------- ------------
EMPLOYEE_ID NOT NULL NUMBER(6)   
LAST_NAME   NOT NULL VARCHAR2(25)
SALARY               NUMBER(8,2) 
sonucu karşımıza çıkıyor bu da demek oluyorki oracle hiç çaktırmadan ben viewim demiyor veya senin erişebileceğin kolonlar sadece bunlar demiyor. Direkt olarak tablo bu kardeşim diyor. Harikulade değil mi ? :)

evet şimdide departmanı 50 olan kışilerin
employee_id, last_name,salary*12 kolonlarını birer alias ekleyerek salview adında bir view oluşturalım.

create view salview
as select employee_id ID_NUMARA, last_name SOYAD,
salary*12 MAAS from employees where department_id=50;

bu viewe select çektiğimizde artık oluşturduğumuz şartları ekranda göreceksiniz.


Complex view

Simple viewde demiştikki sadece select ifadelerini çekeriz complex viewde fonksiyonlar, tablo birleştirmeleri yapabiliriz.Ayrıca belirtmeliyimki simple viewde DML işlemleri yapabilirsiniz (Yapmayın kesinlikle tavsiye etmem )fakat Complex viewde bu mümkün değildir.


dept_top_vi adında bir view oluşturalım
departmanlara göre gruplandırdığımız departman isminin olduğu minimum maaş kolonunu, maksimum maaş kolonunu ve ortalama maaş kolonunun olduğu bir view oluşturalım ve hatta her kolonun aliası olsun.





create view dept_top_vi
as select d.department_name Departman, MIN(e.salary) "Minimum Maaş",
MAX( e.salary) " Maksimum Maaş", AVG(e.salary) " Ortalama Maaş"
from employees e join departments d
using ( department_id)
group by d.department_name;

Oluşturduğumuz view üzerinden insert komutunu çalıştırmaya kalkarsanız
SQL Error: ORA-01733: virtual column not allowed here
01733. 00000 – “virtual column not allowed here”

hatasını alıcaksınız. ve yine aynı şekilde update komutunu çalıştırdığınızda da aynı hatayı alıcaksınız.


select view_name from user_views; sorgusuyla oluşturduğunuz veya oluşturulan viewleri görebilirsiniz.

SELECT text FROM user_views where view_name ='DEPT_TOP_VI';

Sorgusunu çalıştırdığımızdada oluşturduğumuz viewin içinde hangi sorguyu sakladığını görebilirsiniz.

View'de DML işlemleri gerçekleştirme kuralları

  • Simple view de DML işlemleri gerçekleştirilebilir
  •  View içeriyorsa ve aşağıdaki 4 maddeden biri varsa satır silme işlemi yapamazsınız:
  1. Grup Fonksiyonları
  2. Group by 
  3. Distinc keywordu
  4. Rownum keywordu
  • Aşağıdakileri içeriyorsa verileri düzenleyemezsiniz
  1.  Grup fonksiyonları
  2. Group by
  3. Distinct
  4. rownum
  5. ifadeler
  • Aşağıdakileri içeriyorsa veri ekleyemezsiniz.
  1. Grup fonksiyonları
  2. Group by 
  3. Distinct
  4. Rownum
  5. ifadeler tarafından tanımlanan koşullar
  6. NOT NULL
Tavsiye: Her ne olursa olsun viewler üzerinden DML operasyonunda bulunmamaya çalışınız!!!





19 Ekim 2015 Pazartesi

Oracle Index kavramı nedir? Nasıl kullanılır?

Oracle  Index kavramı nedir? Nasıl kullanılır?

 

Oracle veritabanında index kavramı oldukça önemlidir. Hatta Performace tuning konusunda sürekli karşımıza çıkacağı aşikardır.


Veritabanında tabloların içindeki verilere daha hızlı erişebilmek için kullandığımız nesneye index denir. Örneğin TürkTelekomun 40 milyondan fazla  kullanıcısının olduğunu biliyoruz. 40 milyon kullanıcılı bir veritabanına select sorgusunu çektiğinizi düşünün herhalde bu veritabanı 350gbtan fazla alan tutuyordur ve bu 350 gb ın tamamını taradığını düşünürsek bu iş saatlerimizi alacaktır işte tam bu sırada karşımıza index nesnesi çıkıyor ve diyorki ben saatlerce bu işlemi yapmam yaparsam insanların tercih sebebi olmam (unutmayalım ki oracle ın dünyada pazar payı %47 dir) eğer ben bu 40 milyon veriyi küçük küçük parçalara bölersem ve aramalarımı bu küçük parçalardan yaparsam daha hızlı olurum diyor ve dikkatleri kendine çekiyor.
Oracle veritabanında tablodan bir sorgu çalıştırıldığı zaman oracle ilk önce tabloda index olup olmadığını kontrol eder ve çekilecek verinin %15 ine eşit ve daha az ise sorguyu index nesnesi üzerinden çalıştırır. Böyle bir sorgu bütün tabloyu taramasından daha hızlı çalışacaktır. Tabi küçük tablolarda çalıştığınızda bu tür sorguların hızında çok fazla değişiklik farketmeyeceksiniz fakat az önce verdiğimiz TürkTelekom örneğinde 350gb verinin tamamını taramak oldukça zor olacaktır. Velhasıl kelam bu yaptığımız işe INDEX SCAN diyoruz. Ha peki index yoksa ve çekilecek veri %15e tekabül eden rakamdan daha fazla ise ne yapıcak diye soracak olursanız, cevabı basit tüm tabloyu tarayacaktır bu işleme de FULL SCAN diyoruz.
Peki kardeşim bu index nesnesinin o kadar avantajından bahsettin yok mu bunun hiç dezavantajı diye soracak olursanız bizde bu sorunun cevabını vermeye çalışırız.
  • Indexler fiziksel olarak Diskte yer kapladığı için gerekmedikçe Index kullanmak ekstra disk maliyetini artıracaktır.
  • Indexler genel anlamda sorgularımızda performansı artırırken DML ( insert,update,delete ) işlemlerini ise yavaşlatmaktadır. Özellikle çok fazla DML işlemleri yapılan tablolarda index kullanmamak gerekir.
  • Index kullandığımız zaman veritabanının maintenance ( index maintenance ) yükü artacağı için ekstra bir yük gelicektir.

B-Tree index : Bu index tipi oracleda belki en çok kullanılan index tipidir.

B-Tree Index te Oracle veriye erişirken en dıştaki Root blokla başlar. Burada uygun olan Branch e gider ordanda son olarak ilgili leaf e gider ve bu leaf te bulunan ROWID bilgisini okur. Oracle son olarak ROWID bilgisi ile istenen bloğu okuyup kullanıcıya sunar. Örneğin Yukardaki Ağaçta Luis ismi indexten aranırken ilk olarak ROOT sonra İlgili BRANCH ve son olarak doğru olan LEAF e gidip doğru olan kaydı bulup döner.

sayısal verilerde ise en yukarıda verdiğimiz örneği düşünelim. dedikki 40 m kullanıcının tamamını mı taramak daha hızlı olur yoksa daha az bir miktarını mı ? sizde dedinizki tabikide daha az miktarını tararsak bu işlem daha hızlı olacaktır. Daha açık ifadeyle 1-5.000.000, 5.000.001-10.000.000 ... 35.000.001-40.000.000 ve 1-2.500.000, 2.500.001-5.000.000  şeklinde bu verileri bölersek sorgumuz daha hızlı çalışacaktır.

 

Evet bu kadar uzun yazıdan sonra peki index
  • Nasıl oluşturulur?
  • Tabloyu oluştururken indexte beraberinde oluşturulabilir mi ?
  • kullanıcıların indexleri nerede tutulur?
  • Sorguda fonksiyon kullanırsak Full scan mi yoksa index scan mi çalışır ?
  • indexi silmeden nasıl kapatabilirim?
  • oluşturduğum indexi nasıl silerim?

Genel olarak indexin yapısı şu şekildedir.

CREATE [UNIQUE]INDEX index
ON table (column[, column]...);

Aşağıda bir emp_last_name_idx adında employees tablosunun last_name kolonuna index oluşturalım










CREATE INDEX emp_last_name_idx
ON employees(last_name);
eğer oluşturduysak index EMP_LAST_NAME_IDX created bilgisini aşağıda alıcağızdır.


 Bizde bir index oluşturalım fakat employees tablosunda değil de kendi oluşturduğumuz bir tabloda.

CREATE TABLE NEW_EMP
(employee_id NUMBER(6)
PRIMARY KEY USING INDEX
(CREATE INDEX emp_id_idx ON
NEW_EMP(employee_id)),
first_name VARCHAR2(20),
last_name VARCHAR2(25));


NEW_EMP adında ve employee_id,first_name,last_name kolonları olan bir tablo oluşturduk eğer farkettiydeniz employee_id kolonunu oluştururken "using index (create index.... ) " kullandık ve tablo oluşturuken indeximizide oluşturmuş olduk.

Kullanıcıların indexleri nerede tutulur ?

SELECT INDEX_NAME,TABLE_NAME
FROM
USER_INDEXES
WHERE TABLE_NAME = 'NEW_EMP';

sorgusunu çalıştırırsak
INDEX_NAME           TABLE_NAME
EMP_ID_IDX               NEW_EMP

karşımıza çıkacaktır. burada user_indexes tablosundan index ismini ve hangi tabloda çalıştığını görürüz.

 Sorguda fonksiyon kullanırsak Full scan mi yoksa index scan mi çalışır ?

insert into employees (employee_id,first_name, last_name, email, hire_date, job_id)
values (310,'JACK','KAN','JKan','10-JUN-2005','IT_PROG');

sorgusunu çalıştıralım
Evet biliyoruzki
select * from employees where last_name='KAN';
çalıştırdığımızda EMP_NAME_IX indexini kullanıcaktır. Peki ya Where tümcesinde fonksiyon kullanırsam?

select * from employees where LOWER(last_name)='kan';
ve göreceğizki FULL SCAN yapmış.
Yani sorgumuzda Fonksiyon kullanırsak oracle indexi iptal edecektir.
Peki bunu nasıl önlerim ? Tabikide indexi oluşturuken belirttiğimiz kolon isminde fonksiyon kullanarak Yani;

CREATE INDEX lower_last_name_idx
ON dept2(LOWER(last_name));
oluşturalım ve aynı şekilde select çekelim göreceğizki index olarak taratmış.


Indexi silmeden çalışılabilirliğini engellemek için ALTER INDEX kullanırız

 oluşturduğumuz emp_id_idx indexini invisible yapalım
ALTER INDEX emp_id_idx INVISIBLE;
çalıştırırız. Tersinide siz düşünün.

Index Nesnesini silme

DROP INDEX emp_id_idx;

Bu konumuzunda sonuna gelmiş bulunuyoruz. Yardımım dokunduysa ne mutlu. İyi Oracle'lı günler dilerim

Muhammed Mustafa TEMEL

Oracle Sequence nedir, nasıl kullanılır?


         Oracle  Sequence nedir, nasıl kullanılır?


Sequence:Oracle'da artan veya azalan sıralı nümerik değerler kullanılmasını sağlar

Sequence yapısının genel hali

CREATE SEQUENCE sequence_adi
              [ {START WITH | INCREMENT BY} integer
                |{MAXVALUE integer | NOMAXVALUE}
                |{MINVALUE integer | NOMINVALUE}
                |{CYCLE|NOCYCLE}
                |{CACHE|NOCACHE}
                |{ORDER|NOORDER} ];

bu şekildedir
nasıl tablo oluştururken create table kullanıyorsak bu yapıdada create sequence syntaxi ile yazılır.
START WITH:Sequence in başlangıç değerini belirler. default u 1dir.
INCREMENT BY : Sequence in artış miktarını belirler. +1, +2, +3 sırasıyla 1er 1er 2şer 2şer 3er 3er artar. Peki azaltmakta mümkün demiştik bunu nasıl yapıcağız derseniz tam tersi -1, -2, -3 sırasıyla 1er 2şer 3er azalır.
MAXVALUE         : Artan Sequence in en yüksek değerini belirler
NOMAXVALUE    : Artan Sequence in maksimum bir değerinin olmadığını belirler
MINVALUE:Azalan Sequence in minimum değerini belirler
NOMINVALUE :
CYCLE : Sequence in maksimum değere ulaştıktan sonra start with değerine geri dönmesini sağlar
NOCYCLE: NOCYCLE ise CYCLE özelliğinin kapatır.
CACHE: Bir hata meydana gelince cachede tutulan değerleri tekrar kullanmak istersek CACHE olarak belirtiriz
NOCACHE: CACHE özelliğini kapatır
ORDER:
NOORDER


HR şemasında ornekemp tablosu oluşturup (empid, fname, lname,sal) kolonlarını oluşturup içinede employees tablosunda bu değerlere karşılık gelen kolonların verilerini atalım.
yani
create table ornekemp ( empid number(6) constraint emp_id_pk primary key,
                        fname varchar2(25) ,
                        lname varchar2(25) not null,
                        sal number(8,2));
tablomuza select çektiğimizde
select * from ornekemp order by empid desc;
eğer daha önce hiç bir insert yapmadıysak en üstte William ı görmüşsünüzdür.206 William ın empid si ve unique.
206    William    Gietz    8300

bir sequence düşünelim ismi ornek_empid_seq olsun ve 207 den başlasın birer birer artsın maksimum değeri 999999, cycle özelliği olmasın. E hadi yapalım


create sequence ornek_empid_seq
                start with 207
                increment by 1
                maxvalue 999999
                nocache
                nocycle;

Evet sequence imiz oluşmuştur. isterseniz sequenceimizin oluşup oluşmadığını kontrol edelim
select * from user_sequences where sequence_name='ornek_empid_seq';
sorgusunu çalıştırıyoruz. Eğer herşey yolunda gittiyse SEQUENCE_NAME kolonunda kendi yazdığımız sequence imizi görebiliriz ve tabikide diğer kolonlarda sequence imizin özelliklerini ve hatta hangi nümerik değerde kaldığını last_sequence kolonundan görmeniz mümkün.

ve sırada insert deyimi ile veriler eklerken sequence imizin nasıl çalıştığını görelim.

insert into ornekemp (ornek_empid_seq.nextval,'Uğur','Güveç',4500);
çalıştırdığımızda
1 rows inserted sonucunu görürseniz büyük ihtimal herşey yolundadır peki bunu nasıl anlarız ? tabikide select çekeceğiz
select * from ornekemp order by empid desc;
ve gördüğünüz üzere William ilk sıradaydı şu anda Uğur un empid si 207 şeklinde atanmış oldu. Burada .nextval ile empid değerini bir artırıp paranteze yazdırmış olduk
207    Uğur    Güveç    4500

peki bu oluşturduğumuz  ornek_empid_seq adındaki sequence ı nasıl düzenleyebiliriz?
artış değerini 10 max değerinide 9999 yapalım
alter sequence ornek_empid_seq
               increment by 20
               maxvalue 9999;
tekrar bir değer insert edip select çektiğinizde  227 empidsi ile bir kullanıcı eklediğinizi göreceksiniz. Not: start with değerini alter edemezsiniz.
Peki bu oluşturduğumuz Sequence i nasıl silebiliriz?
drop sequence ornek_empid_seq;
sorgusunu F5 ile çalıştırdığımızda sequence ornek_empid_seq dropped. çıktısını aşağıda göreceksiniz.