24 Ekim 2010 Pazar

SQL Server da Constraint ler Nasıl Çalışır?

SQL Server'daki tablolara konulmuş constraint(kısıtlar)ler, bir tabloda bir DML kodu (INSERT, DELETE, UPDATE, MERGER) çalışırken kontrol edilir.

Eğer gelen veri, tablodaki tüm kurallardan geçiyorsa işlem tamamlanır, eğer herhangi bir kolondaki, herhangi bir kısıta takılıyorsa o zaman transaction rollback edilir ve hiç bir veri güncelleme işlemi yapılmaz.

Örneğin email alanına bir check constraint koyduysanız ve aynı anda 10 kayıt birden insert ediyorsanız, ancak sadece 1 tanesi sorunluysa, tüm insert cümlesi rollback edilir ve hiç bir kayıt tabloya eklenmez.

Unique Constraint

Unique constraints, PRIMARY KEY e çok benzer. Tek farkı bir tabloda bir tane primary key olabiliyorken, gerektiği kadar unique constaint olabilmesidir.
Örneğin Müşteri tablonuzdaki, Ad, Soyad ve TelefonNo birleşiminden bir unique constraint yapıbilir, aynı zamanda email adreslerinin tutulduğu kolon için ayrı bir unique constraint yaratabilir ve email adreslerinin her müşteri kaydı için farklı olmasını garanti altına alabilirsiniz.
Unique constraint olan bir tabloda sadece 1 tane null değer olabilir.

Primary Key Nedir?

Primary Key aslında bir constraint (kısıt) dır. Bir tablonun bir satırını temsil eden tekil bir belirleyici kolondur.
Bir tabloda tek bir primary key olabilir. Ancak bir primary key tek bir kolondan veya birden fazla kolonun biraraya gelmesinden oluşabilir.

CHECK Constraint Nedir?

SQL Server'da bir çok constraint (kısıt) kullanılabilir.
"Check Constraint" verinin doğruluğunu ve bütünlüğünü korumak üzere kullanılan bir kısıttır. Check constraint eklenmiş bir kolona yeni bilgi eklenirken veya bilgi güncellenirken, veri yazılmış olan kurallara göre kontrol edilir ve kurala uymuyorsa bir hata verilir ve veri kaydedilmez.

Check constraint ifadesi, true veya false döndüren bir kural setidir. Bu bir scalar function olabileceği için bir query de olabilir. Check constraint sadece false değer döndüğünde hata verir. Eğer ifade null döndürürse, bunu true gibi değerlendirir ve herhangi bir hata vermeden veriyi günceller.

Örneğin bir kolonda sınavlardan alınacak notları tutacak olalım. Notlar da 0-100 arasında değişiyor olmalı. Grade alanına bu kısıtı ekleyelim ve 100 ün üzerinde data girilmesini engelleyelim.

ALTER TABLE myTable ADD CONSTRAINT
CK_Grade CHECK(Grade <= 100 AND Grade >= 0)


Eğer tablomuzda veriler varsa ve daha önceden girilmiş verilerin kontrol edilmesini istemiyorsak with nocheck ifadesiyle bunu yapabiliriz. Aksi takdirde, veriler eklenen kurala uygun hale getirilene kadar check constraint eklenemez.

ALTER TABLE myTable WITH NOCHECK ADD CONSTRAINT
CK_Grade CHECK(Grade <= 100 AND Grade >= 0)

Computed Columns Nedir? Nasıl Kullanılır?

Computed column, bir tablonun aynı satırındaki diğer alanlara referans ederek hesaplama yapan bir formüldür aslında. Scalar fonksiyonlar da (tek bir değer döndüren fonksiyon), computed column tanımlarken kullanılabilir. Bir computed column, başka bir tablodaki verilere (tabii fonksiyon kullanmıyorsa) ulaşamaz veya sub query içeremez.

Varsayılan olarak, SQL Server'daki computed column lar sanaldır. Yani içerdikleri değerler diskte saklanmazlar, veri çekildiği zaman hesaplanırlar. Bu nedenle computed column içeren bir tabloyu SELECT * FROM ile çekmek performans sıkıntılarına yol açabilir.

Computed kolonları daha etkin tutmak ve performansını arttırmak için, disk üzerinde de saklayabiliriz. Bunun için PERSISTED anahtar kelimesi kullanılabilir.
SQL Server, persisted ile işaretlenmiş computed alanları, gerçek bir değer olarak disk üzerinde saklar ve bu alanı etkileyecek herhangi bir değişiklik olduğunda veya yeni kayıt eklendiğinde bu alanı da günceller.

Sadece deterministic fonksiyon kullanan computed kolonlar PERSISTED olarak işaretlenebilir.
Deterministic fonksiyon, aynı değer verildiğinde aynı sonucu döndüren fonksiyondur. Örneğin avg fonksiyonu, aynı değerler ile her zaman aynı sonucu döndürür. Oysa getdate(), deterministic bir fonksiyon değildir.

Bir computed column, deterministic olsun veya olmasın içerisindeki veri güncellenemez. Dolayısıyla hiçbir zaman insert veya update cümlesi içerisinde güncellenecek alanlar içerisinde yer alamaz.

Bir örnek ile nasıl computed kolon yaratıldığını görelim.
Bir tabloda ürünün birim satış fiyatı ve vergi oranı olsun. Vergi eklenmiş hali kaç fiyata satılacağını computed kolon kullanarak bulabiliriz.

ALTER TABLE myTable ADD PriceWithTax as UnitPrice + (UnitPrice*TaxRatio)

sys.Objects View ile veritabanındaki nesnelerin görüntülenmesi

SELECT * FROM sys.objects

kodunu çalıştırarak veritabanındaki tüm nesnelerin listesine ulaşılabilir.

Bu kodun döndürdüğü alanlardan bazılarına bakalım.
name :nesnesnin adı
object_id: SQL Server'deki her bir nesnenin tek bir id si vardır. Sistem tablolarında veya view lerinde bu id ile kullanırlar. Örnein bir tablonun içindeki kolonlar sys.columns view i kullanılarak görülebilir. Bir kolonun hangi tabloya ait olduğu bilgisi saklanırken, objenin adı değil, id si saklanır. Bir nesnenin id sini öğrenmek için de object_id sistem fonksiyonu kullanılabilir.

SELECT object_id('myobjectname')

type : SQL Server objesinin ne tür bir obje olduğunu gösterir. Aşağıda bu türlerin listesini bulabilirsiniz.

C Check constraint
D Default constraint
F Foreign Key constraint
FN Transact-SQL scalar function
FS Clr scalar function
IT Internal table
P SQL stored procedure
PK Primary Key constraint
S System table
SQ Service queue
TF SQL table valued function
TR SQL trigger
U User table
UQ Unique constraint
V View

Performance Data Management ve Resource Governor

Performance data management SQL Server 2008 ile gelen yeni bir tool.
Bu tool, zamanla, SQL Server üzerinden performans ile ilgili veri toplamımızı sağlıyor.
Bir datawarehouse (toplandığı sonuçları saklamak için) ve  "data collector" (belli zamanlarda çalışarak veri toplamak için) parçalarından oluşuyor.Data Collector sadece SQL Server 2008 versiyonlarındaki veritabanları için çalışıyor.

Resource Governor ise süreçlerin kaynak kullanımlarını sınırlandırarak, iş yüklerinin yönetilmesine olanak veriyor.
Resource Governor u kullanmak için, DBA bir "workload group" ve bir "resource pool" yaratır. Workload group ları kullanıcıların oturumlarını tutan yapılardır.  Workload groupları,  resource pool ları ile eşleştirilirler. Bu eşleştirmeler sınıflandırıcı fonksiyonlara göre (classifier functions) yapılır. Sınıflandırıcı fonksiyonlar IP, kullanıcı adı, uygulamanın adı olabilir.
Resource Governence tool'u kullanarak, kritik uygulamalara daha fazla ram, cpu gibi kaynaklar ayırıp, çok fazla performansa ihtiyacı olmayan uygulamalar için daha az kaynak ayırabiliriz örneğin.