Pazartesi , 20 Kasım 2017

Farkli Collation Kullaniminin Sorgu Performansina Etkisi

Collation, SQL Serverda tutulan metinsel verilerin nasıl davranacağını belirten ayardır. Collation ayarı SQL Serverda hiyerarşik olarak ayarlanır. Yani Hem SQL Server için Collation seçilirken aynı zamanda veritabanı için de farklı bir Collation seçilebilir. Hatta oluşturduğumuz tabloda metinsel veri içeren kolonlarımızın bile Collation değeri farklı olabilir. Bu sebeple Collation değeri farklı olan iki tablodaki verileri karşılaştırmaya çalıştığımızda aşağıdaki gibi bir hata ile karşılaşırız.

select * from sys.messages
where message_id=468 and language_id=1033

1

Şimdi yukarıdaki durumu örneklemek amacıyla Collation değeri farklı olan iki veritabanında iki tablo oluşturup örnek yapalım. Aşağıdaki gibi bir veri tabanının Collation değerini görüntüleyebiliriz.

SELECT DATABASEPROPERTYEX('tempdb', 'collation')</pre>
<pre>as tempdb_Collation

SELECT DATABASEPROPERTYEX('AdventureWorks2012', 'collation')</pre>
<pre>as AdventureWorks2012_Collation

Yukarıdaki sorgularımızın çıktısı aşağıdaki gibi olacaktır.

2

Yukarıdaki resimde gördüğümüz gibi tempdb veritabanımızın Collation değeri Turkish_CI_AS iken AdventureWorks2012 veritabanımızın Collation değeri SQL_Latin1_General_CP1_CI_AS’dir. Bu iki veritabanımızın Collation değeri farklı olduğu için örnek olarak bu iki veritabanında varsayılan Collation ayarı kullanılarak oluşturulmuş iki tablo üzerinde örnek yapabiliriz. Şimdi Tempdb veri tabanımızda aşağıdaki gibi bir tablo oluşturduktan sonra bu tablomuza örnek veriler ekleyelim.

3

Yukarıdaki gibi tablomuzu Tempdb veritabanında oluşturduğumuzda Name kolonumuzun Collation değerini belirtmediğimiz için varsayılan olarak veri tabanının Collation ayarını alacaktır. Product adlı tablomuzu oluşturduktan sonra bir alt kısımda ise bu tablomuza 20 tane kayıt ekledik. Son olarak karşılaştırma için kullanacağımız Name kolonu için de indeks oluşturduk. Şimdi Tempdb veritabanında oluşturduğumuz Product tablosu ile AdventureWorks2012 veritabanında var olan Product tablosunu aşağıdaki gibi Name kolonu üzerinden birleştirerek sorgumuzu yazalım.

4

Yukarıdaki sorgumuzu çalıştırdığımızda daha önceden değindiğimiz aşağıdaki hatayı alacağız.

5

Yukarıdaki hatayı çözmek için sorgumuzda aşağıdaki gibi Collate ifadesi ile kullanacağı Collation değerini belirtelim.

6

Sorgumuza yukarıdaki gibi Collate ifadesini ekledikten sonra başarılı bir şekilde çalıştığını görebiliriz. Şimdi sorgumuzun Execution Planını inceleyelim. Execution Planımız aşağıdaki gibi olacaktır.

7

Yukarıdaki resimde görüldüğü gibi Execution Planımızı incelediğimizde Tempdb veri tabanındaki Product tablomuz üzerinde Index Seek işlemi yapılırken AdventureWorks202 Product tablomuz üzerinde tanımlanmış olan Name indeksi üzerinden Nonclustered Index Scan işlemi tercih edilmiştir. Bu tercih edilen Nonclustered Index Scan işlemi sebebi ise kullandığımız Collate ifadesidir. Çünkü Collate işlemi sonucunda çıkan değer değişebileceği için SQL Server Index Seek işlemini tercih etmemiştir. Şimdi yanı yapıda ikinci bir tablo oluşturup tabloyu oluştururken Collation değerini belirtelim ve sorgumuzda Collate ifadesini kullanmak zorunda kalmayalım. Yeni oluşturacağımız tablomuz aşağıdaki gibi olacaktır.

8

Yukarıdaki sorgumuzda az önce kullandığımız Product tablosunun aynısını Product2 adıyla yeniden oluşturduk. Aynı şekilde 20 tane kaydı ekledikten sonra tablomuzdaki Name kolonu üzerinde indeks oluşturduk. Yeni oluşturduğumuz tablomuzdaki Name kolonunun collation değeri AdventureWorks202 veritabanında ki Product tablomuz Name kolonu ile aynı olduğu için sorgumuzda artık Collate ifadesini kullanmak zorunda değiliz. Sorgumuzu aşağıdaki gibi yazabiliriz.

9

Yukarıdaki sorgumuz Collate ifadesini kullanmadan da başarılı bir şekilde çalışacaktır. Şimdi sorgumuzun Execution Planını inceleyelim.

10

Yukarıdaki resimde gördüğümüz Execution Planımızı incelediğimizde her iki tablomuz üzerinde de Nonclustered Index Seek işleminin tercih edildiğini görebiliriz. Bu sebeple sorgularımızda zorunlu olmadığımız sürece Collate ifadesini kullanmaktan kaçınmalıyız.

Sorgularımızda Collate ifadesine ihtiyaç duyduğumuz durumlar genellikle kullandığımız geçici tablolar oluyor. Sebebi ise SQL Server kurulurken genelde varsayılan Collation ayarı değiştirilmez ve Tempdb veri tabanımızda bu ayar ile oluşturulur. Daha sonradan oluşturduğumuz veya başka bir makineden taşıdığımız veri tabanlarının Collation değeri farklı olduğu durumlarda Collate ifadesini kullanmak artık bir zorunluluk haline gelecektir. Eğer böyle bir durumla karşı karşıya kalırsanız ve Colaltion değerini değiştiremiyorsanız sorgularınızda Collate ifadesini kullanırken küçük olan tabloya Collate ifadesini ekleyin.

Hakkında ismailadar

Cevapla

E-posta adresiniz yayınlanmayacak. Required fields are marked *

*


*

Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>