Kategori : SQL

Sep 30 2011

SQL SERVER INDEXLER

Index: Kısaca data’ya erişim zamanını kısaltan yapılardır.Konunun devamında hangi sütunlara index uygulamalıyız ve neden ,index çeşitleri nelerdir,sorularına cevap arayacağız.

Öncelikle neden index  yaratmalıyız ;

Databasedeki kayıt sayısı arttıkça performansta bir düşüklük yaşanır. Data yoğunluğu arttıkça da istenilen sonuca ulaşma süresi uzar. Oysa bizim için önemli olan maximum performansı elde tutmaktır.
 
Bir sql sorgusu çalıştığında neler olur örnek bir sorgu yazarak görelim.
 
-- SELECT isim FROM deneme WHERE ad LIKE e% 
 
Sorgu çalıştığında tablo içindeki tüm sayfaları tek tek aramaya başlar ve ismi e harfi ile başlayanları (bizim belirlediğimiz kriterlere uyan kayıtları) listeler. Tabi bu işlemi yaparken tablonun başından başlar ve bu verilere erişim hızını düşürür.
 
Diğer bir yöntem ise indexleme kullanımıdır sql server sorgu çalıştırıldığında öncelikle bir index olup olmadığını kontrol eder.Başlıca nedeni tabiki hızlı erişim. Örneğin kitapların arka kapaklarında index bölümü vardır. Diyelim ki kitabın içinde group by terimini arıyorsunuz bunun için ya bin küsür sayfalık kitabın bütün sayfalarını tarayacaksınız ya da index bölümünden alfabetik olarak o terimin hangi bölümünde kaçıncı sayfada olduğunu hemen kolaylıkla bulacaksınız.
Index Çeşitleri;

1_)Clustered Index :

-Bir tabloda en fazla bir tane clustered index uygulayabileceğimizi unutmamalıyız(Primary key veya Uniqe key alanlar)

-Clustered indexler tablonun içindeki verinin fiziksel sıralamasını tanımlarlar.

-Tablo boyutunun % 5 i kadar yer kaplarlar.Yaratılırken bu boyut geçici bir süre için %20 ye çıkar.

-Bir satır silindiği zaman oluşan boşluk yeni bir satır girişi için hazır bekler.

2_)Non-Clustered Index:

-SQL Server’da bir tabloda en fazla 249 non_clustered index tanımlanabilir.(son sürümünde bu sayı daha da arttı.)

-Oluşturulan index’in yapısı belirtilmezse non_clustered index oluşturulur.

-Non_clustered index’ten önce clustered index oluşturulması performansı arttırır.

-Tablo ve bu tabloya ait nonclustered index ler farklı filegroup larda olabilir. Farklı harddiskler de yer alması performansı artırır.

Hangi Sütunlara Index konulmalıdır?

- Primary key ve Foreign key sütunları.

- Sorgularda çook sık kullanılan sütunlar.

- Çok sık sıralamaya tabi tutulan sütunlar.

- Gruplama yapılan sütunlar (group by).

Index gerektirmeyen Sütunlar:

- Nadiren sorgulanan sütunlar.

- Az seçeneği olan sütunlar(cinsiyet,ülke gibi).

- Text,ntext ve image sütunları.

Dikkat edilecek noktalar:

- Primary key veya Unique constraint oluşturulduğu zaman index otomatik olarak oluşturulur. Standart index oluşturmak yerine Primary key veya Unique constraint tercih edilmelidir.

- View’larda da index olabilir.

- Bir sütun  üzerinde index oluşturmadan evvel bir index’e sahip olup olmadığı araştırılmalıdır.

- Bir tabloda index oluştumak için tablonun sahibi olmak gerekir.

Unique (Benzersiz) Index: Bir kolon üzerinde bu özellikle yaratılan unique indexlerde kolona aynı değerde bir kayıt girilemez.

- Hem clustered hem de nonclustered için kullanılabilinir.

- Primary key ve unique constraint varsa zaten unique index oluşturulmuştur.

- Unique özelliği dolu bir tabloya index oluşturulurken veya daha sonradan ekleniyorsa önce tablodaki o kolona ait bilgilerinden eşsiz olduğuna emin olduktan sonra yaratılır.

Composite (Birleşik) Index: Birden fazla kolona uygulanabilen indexlerdir.

-Sorgularda sık sık kullanılan birkaç kolona ayrı ayrı index oluşturmaktansa bu kolonları tek bir index altında toplamak tercih edilmelidir. Daha performanslıdır.

- En fazla 16 sütun olabilir.

- View larda kullanılacaksa farklı kolonlar farklı tablolarda olabilir.

- Aynı sütunü birden fazla index içinde kullanmak çok kullanışlı değildir.

Page Split: Clustered indexlerde yeni eklenen veya güncellenen bir satır için yeterli yer yoksa  sayfa ikiye bölünür. Non_clustered indexlerde bölünme olmaz, yeni sayfa sona eklenir, ilişkisi olduğu diğer sayfadan oraya yönlendirme yapılır(Page forwarding).

Index Seçenekleri

FillFactor: Clustered ve nonclustered index lerde kullanılabilinen fillfactor özelliği ile update ve insert işlemlerinde performans artışı sağlanılır. Bir index sayfası dolduğu zaman sql server yeni gelen satırlara yer açmak için leaf level da PageSplit kullanır. FillFactor kullanarak yeni kayıtlar için leaf level da boş satırlar bırakabiliriz.

-  Fillfactor sadece index yaratılırken veya yeniden yapılandırırken belirlenebilir, daha sonra dışardan değiştirilemez.

- Fillfactor oranı bilgileriniz ne kadar sıklıkla değiştiğine ve yeni kayıtlar eklendiğine göre belirlenir.

 

4 yorum - Gönderen : Egemen Ateş (12:02 PM) - Kategori : Genel | SQL

Sep 28 2011

Full Text Search(Tüm Metinde Arama)

 Full text search, karakter bazlı aramalarda daha verimli sonuçlar elde etmek için kullanılan bir sql servisidir.işleyişi hakkında kısa bir bilgi vermek gerekirse , bu servisi kullanmak için öncelikle full text indexler tanımlanmalıdır.Bu indexler, belirtilen alanın verisini, fiziksel olarak belirtilen alana indexleyerek bu alan içerisinde arama yapılmasını kolaylaştırır.

Neden Full Text search KULLANMALIYIZ ?

-Verilerimizin boyutu büyük olduğu zaman like operatörü ile arama yapmak çok uzun zaman alacak ve performansı düşürecektir.

-like operatörü ile formatlanmış binary verilerde arama yapmak imkansızdır.

-like operatörü ile yapılan aramalarda sonuc büyük ve küçük harflere duyarlıdır.

Sıraladığımız maddeleri göz önünde bulundurduğumuzda yüksek boyutlu verilerin(karakter) tutuldugu tablolarda veya kolonlarda full text search servisini kullanmak daha akıllıca olacaktır.Bugün internette yer alan bir çok arama motorunun da bu özelliği kullandığını unutmamakta fayda var.

NOT:Full text search özelliği uygulanacak tablolarda mutlaka bir uniqe alan olmalıdır.unutulmaması gereken bir diğer nokta ise full text indexler char,varchar,text,ntext,nchar ve nvarchar data türüne sahip kolonlar üzerinde tanımlanabilir.   

1 yorum - Gönderen : Egemen Ateş (2:27 PM) - Kategori : Genel | SQL | TSQL

Sep 27 2011

stored procedure(saklı yordamlar)

Kısaca database yönetim tarafında tutulan derlenmiş sql cümlecikleridir.Çok katmanlı mimarilerde kullanıldığı zaman fayda sağlanması beklenmektedir.

Başlıca avantajlarını sıralayacak olursak;

-Hız

-Performance

-Güvenlik

-İstemci yükünün azaltılması

-Network(ag) trafiğinin azalması

 Yukarda belirttiğimiz avantajları biraz açacak olursak,örneğin sql cümleciklerimizi program kodlar içerisinden gönderdiğimizde ,gönderdiğimiz bu cümleler herdefasında derlenip çalıştırılacağı için performans ve zaman kaybına neden olacaktır.Diger bir şekilde bunları stored procedure olarak kaydettiğimizde program kod kısmından ilgili parametreleri alıp sql cümlesini database in bulunduğu sunucu makinada çalıştıracağı için ,istemci makinada ki iş yükünü azaltıp,performansı arttıracaktır,stored procedureler yalnızca ilk çagrıldıklarında derlenir ve bir işleyiş planı oluşturularak diğer kullanımlarda tekrar derlenmemek için memory e cache edilecektir.Bu işleyiş planı sql server re-start edilmedikçe ve uzun süre az kullanımdan dolayı yaşlanmadıkça(aging) cache edilecektir.Diger bir artısı network ağ trafiginin azaltılmasını sağlamak.sadece Execute stored proc_name ifadesini hat üzerinden  gönderir.Tamamen T-SQL komutları göndermek yerine bu daha performanslı olacaktır.İyi tasarlanmış bir procedure kullanımı client ile server arasındaki round triplerindeki trafiği bir fonksiyon çağırma gibi kullanım şeklinden dolayı azaltır.bir diger faydası  ise bakım yapılabilirliği olması , örneğin yeni oluşturmuş olduğumuz x,y,z tablolarımızı var olan bir store procedüre içerisinden sisteme entegre etmek ,kod içerisinden sisteme entegre etmekten daha kolaydır ve storaged procedurlerin güncellenmesi kod içerisinden güncelleme yapmaktan daha kolaydır,ve projeyi tekrardan derlemek,test etmek veya deploy etmek zorunda kalmayız.

1 yorum - Gönderen : Egemen Ateş (2:02 PM) - Kategori : Coldfusion | Genel | SQL | TSQL

Sep 20 2011

SQL de TOP kullanılan sorguların performans sorunu

Büyük tablolar üzerinde sorgu yazıyorsanız ve TOP deyimini kullanıyorsanız yaşadığınız performans sorunlarını çözmek için ROW_NUMBER fonksiyonunu kullanabilirsiniz.

Devamı ...

2 yorum - Gönderen : Sevda Mersin (12:55 PM) - Kategori : SQL

Sep 20 2011

Coldfusion 8 de Stored Procedure Cahceleme

Bildiğimiz gibi yapmış olduğumuz stored procedureleri cachedWithin = "time span" sayesinde cahcleyebiliyoruz. Ancak Cf 8 versiyonunda bu mümkün değil.. Cf 8 de cachleme yapabilmek için prosedure'ü şu şekilde çağırmalısınız.

 cfquery name="get_data" datasource="deneme_db" cachedwithin="#createTimeSpan(0,0,0,60)#">
 exec wrk_proc 'a','b'
 

0 yorum - Gönderen : Yunus Özay (5:39 AM) - Kategori : Coldfusion | SQL

Feb 3 2011

MSSQL TEMPORARY TABLES [GEÇİCİ TABLOLAR]

Sql üzerinde bazen performans gereği bazen ise verileri geçici olarak bir tabloda tutma ihtiyacı hissederiz, bunu MSSQL üzerinde kolayca uygulayabilirsiniz. Unutmayın oluşturduğunuz temp table sadece o anki connection için oluşur ve siz connection'ı kapattıktan sonra sql tarafından otomatik olarak drop edilir. Yani sanal tabloları oluşturduktan sonra birde silmesi ile uğraşanız gerekmez..

Örn:

SELECT * INTO #TestTempTable

FROM UYELER WHERE IL='Istanbul'

Bu sql kodu UYELER tablosundaki ili istanbul olanları testTempTable diye sanal bir tabloya aktarır. Kullanırken de aşağıdaki gibi kullanabilirsiniz.

SELECT

* FROM #TestTempTable

Sizin açtığınız connection açık iken bu tabloyu normal SQL tabloları gibi kullanabilirsiniz.

 

0 yorum - Gönderen : Mahmut Er (3:14 PM) - Kategori : SQL | TSQL

Jan 24 2011

Days in Month for Sql,Ayın içindeki gün sayısını bulan sql cümleciği

Birçok programlama dilinde zaten bu fonksiyon mecvut, ancak SQL'de yapılabiliyor,  case when li yapmak gereksiz koda sebebiyet verebilir, aşağıda 1 satırda bu değerin nasıl alınabildiğini göreceksiniz.

SELECT day(dateadd(mm,datediff(mm,-1,TABLODAKI_TARIH_ALANI),-1)) as dayInMonth FROM TABLO_ADI

eğer karışık geldi ise aşağıdaki kodu direkt çalıştırabilirsiniz.

select day(dateadd(mm,datediff(mm,-1,'2010-02-01'),-1)) daysInMonth

bu tırnak ile yazılan kısıma tablonuzdaki tarih alanının adını yazabilirsiniz sorgularınızda..

 

 

0 yorum - Gönderen : Mahmut Er (12:31 PM) - Kategori : SQL | TSQL