
Ekim 13, 2009 18:23 by
molks
SQL server da kullanılan 5 farklı constraint vardır.
1) primary key const.
2) foreign key const.
3) unique key const.
4) default const.
5) check const.
nedir ne işe yarar
primary key veri bütünlüğünün korunması açısından çok önemlidir..oluşturduğumuz id kolonunun başına koyarak tabloya gireceğimiz her kaydın unique olmasını sağlarız..bu kolonda null bir field bulunamaz ve index oluşumu açısındanda çok çok önemlidir çünkü bir tabloyu yaratırken primary key clustered olduğunu belirtirsek sql server o kolon üzerinde direk olarak clustered bir index yaratır..buradaki clustered index yapısını bir kitabın girişinde hangi konunun hangi sayfada olduğunu gösteren sayfa numaraları olarak düşünebiliriz..biz nasıl o sayfalara bakarak kitapta kolayca aradığımızı bulabiliyorsak sql server ın index mantığıda bundan farklı değildir..eğer clustered bir index olmasaydı yani kitabın içindekiler bölümü kitabı yazan tarafından yaratılmasaydı kitabın içinde arama yapmamız oldukça güç bir hale gelirdi değil mi Ayrıca bir kitap için nasıl 2 tane farklı içindekiler bölümü olamazsa aynen bu mantıkla sql server ında 2 tane clustered index i olamaz Ama bir tablo için 255 tane nonclustered index yaratılabilir....peki nonclustered index nedir ??
Nonclustered index se o kitabın en arkasında ki anahtar kelime dizinidir. her anahtar kelimenin yanında o kelimenin bulunduğu sayfa numaraları vardır..Eğer biz bir tablonun kolonu üzerinde unique key const. oluşturursak bu kolon non-clustered bir yapıya sahip olacaktır..Ayrıca içindeki bütün değerlerde unique olmak zorundadır..buradaki primary key den fark unique key const. uyguladığımız kolona null field ekleyebilirken primary de bunu yapamıycak olmamamızdır.. peki biz bu yöntemler dışında nasıl index yaratırız,kriterler ve püf noktalar nelerdir ??
%99 ihtimalle clustered index id kolonuna vereceğimiz için geriye kalan sorun non-clustered indexleri nereye koyacağımız sorusu : )) kısaca basit kod mantığını verip açıklamasını yapalim ;
create nonclustered index ix_kolonlar on employees ( fistname , lastname , hiredate);
bu yazdığım kod ile northwind veritabanının employees tablosunun firstname,lastname,hiredate kolonlarını non clustered yaptım.. kodu bu kadar basit ama önemli olan şey mantığı.. eğer nonclustered bir index yaratacaksak ilk düşünmemiz gereken şey ben hangi kolonlara çok fazla sorgu çekiyorum olmalıdır..
diyelim ki :
select firstname,lastname from employees where hiredate <'01.01.1997'
gibi bir sorguyu..yani employees tablosu üzerindeki bu 3 kolonu çok kullanıyoruz bu kolonları indexlemek sorgularımızın bize dönmesini hızlandıracaktır..özellikle where kriterinden sonra en çok hangi kolonlara kullandığımıza dikkat etmeliyiz.. O zaman bütün kolonlarımı indexliyim sorgularım ışık hızıyla olsun.. =>
indexler gerektiği kadar ve yeterli sayıda yaratılmalıdır..çünkü çok fazla index in olması select sorgusunu hızlandırırken insert update ve delete işlemlerinide yavaşlatacaktır..Ayrıca indexler bozulan bir yapıya sahiptir ve bakıma ihtiyaçları vardır..peki neden bozulur bu indexler ??
sql server a her yeni kayıt eklendiğide girilen index in page i en sona atılır..tablo üzerinde bir kaydı sildiğinizi ve yeni kayıt eklediğinizi düşünün. veya güncelleme işlemi aslında silme ve yeni kayıt ekleme olarak 2 aşamadan oluşmaktadır.. her yeni eklenen kaydın page i en sona atılırken aralarda sürekli boşluklar oluşacaktır..bu oluşan boşluklarda bizim oluşturduğumuz index in bozulmasına yol açacaktır.bu yüzden : DBCC ShowContig ('Categories') gibi bir kontrolle bu bozulmaları kontrol ederiz..eğer bozulma varsa indexfrag kullanarak sıkıştırabiliriz.eğer kayıt sayısı çok fazla ise silip yeniden oluşturulması tavsiye edilir..
Sıkıştırmak için : dbcc indexfrag (northwind,'products',Pk_Products)
komutu kullanılabilir..yani northwind veritabanındaki products tablosunun pk_products isimli index ini fragla : )) indexler hakkında anlatıcaklarım bu kadar dönelim kısıtlamalara.. belkide en önemli kısıtlama foreign key dir..çünkü normalizasyon kilit bir öneme sahiptir..ve foreing key olan kolon primary key kolonuyla kısıtlanır...yani primary de olmayan hiçbir kayıt foreing key kolonuna girilemez..
Gelelim default ve check const'e..
Diyelim ki ürünler tablomuzda stokları tuttuğumuz bir kolonumuz var.. ve stoktaki ürünler de -1 gibi bi sayı olamıyacağı için : )) bu kolona 0 dan küçük bir sayı girilememesini isteyebiliriz..böyle bir durumda check const.yaratıp o kolonu belli bir kriter ile sınırlandırırız bunun içinde şöyle bir kod yazarız :
Alter table Products
add constraint Ck_UnitsInStock1
check(UnitsInStock >-1)
Veya senaryoya göre bir kolona biz hiç kayıt eklemeye tenezzül etmeden sql in kendiliğinden bir değer vermesini isteyebiliriz.. mesela tabloda uyruk diye bir kolon var tutucağımız her kayıtdaki kişi TC vatandaşı..o zaman bırakırız sql o kolona her kayıt için TC yazar..
31fa82a2-3853-4eb5-b14a-fbc5f006cb5f|5|4.6