Recent comments

None


İçerik Ara











Yasal Uyarı
Bu sitede sunulan tüm bilgi ve dökümanlar Turgay Sahtiyan tarafından yazılmaktadır. Yazıların kaynak göstermek şartıyla kullanılması serbesttir.

© Copyright 2009-2013
Takvim
<<  Ekim 2017  >>
PaSaÇaPeCuCuPa
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345
Keywords

SQLPass Turkey Chapter (www.sqlserveronculeri.com), 5 Ekim 2013'te üçüncüsünü düzenleyeceği SQLSaturday etkinliğinde bu sene bir farklılık katarak etkinliğin bir önceki günü olan 4 Ekim 2013 Cuma günü tam gün PreCon eğitimi düzenliyor.

SQL Server MCM Andreas Wolter'ın "SQL Server Performance Analysis & Tuning Techniques" başlıklı bu eğitimine 15 Eylül'e kadar erken kayıt indiriminden faydalanarak kayıt olabilirsiniz.

Detaylar için;
http://www.sqlserveronculeri.com/Files/SQLSaturday258/SSOPreCon/SSOPreConDuyuru.html

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Uygulama geliştirme sürecinde SP'lerin adlarını değiştirmemiz gerekebilir. Bu değişikliği sp_rename ile yapmaktansa drop&create ile yapmak best practice'dir

[more]

İsim değişikliğini sp_rename ile yaptığımızda sys.sql_modules'teki definition alanında bulunan SP adı değiştirilmez. Değiştirilmediği için bu catalog view'i ya da sp_helptext system procedure'unu kullanırsanız yanlış bir code'a erişmiş olursunuz. Bu yüzden SP değişikliklerini drop&create şeklinde yapmanızı kesinlikle tavsiye ederim. (Detaylı bilgi için http://msdn.microsoft.com/en-us/library/ms188351.aspx)

Şimdi bu durumu görmek için. Önce bir SP create edelim ve daha sonra bu SP'nin adını sp_rename ile değiştirip sys.sql_modules ve sp_helptext sonuçlarına bakalım.

--bir calisma DB'si create edelim
create database dbTurgay
go
use dbTurgay
go
--Bir SP create edelim
create proc mySP 
as
	select * from sys.databases
GO
--SP'nin adini sp_rename ile mySP_New seklinde degistirelim
exec sp_rename 'mySP','mySP_New'
GO
--ve daha sonra sys.modules ve sp_helptext sonuclarina bakalım
select * from sys.sql_modules
where object_id =object_id('mySP_New')
GO
sp_helptext 'mySP_New'
GO

image

Gördüğünüz gibi SP’nin adını değiştirmemize rağmen sys.sql_modules ve sp_helptext hala eski SP adını göstermekte.

Değişikliği SSMS GUI üzerinden yapacak olursan gene aynı problemli sonuç ortaya çıkacaktır.

Problemsiz bir şekilde isim değişikliği yapmanın tek yöntemi SP’yi önce drop etmek daha sonra tekrar create etmektir.

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Index’lerin içinde bulundukları filegroup’ları değiştirmek istediğimizde drop edip tekrar create etmemiz gerekir. Bu işlemi yapabilmek için de elimizde 2 farklı seçenek var. “Create With Drop_Existing = On” ve “Drop&Create”. Bu yazımda bu 2 seçenek arasındaki farka bakıyor olacağız.

[more]

Aslında ilk bakışta 2 seçenek te aynı gibi duruyor.

  • Drop&Create seçeneğinde index’i önce drop edip daha sonra tekrar create ediyoruz.
    DROP INDEX CI1 on tbl1
    GO
    CREATE INDEX CI1 on tbl1 (Col1)
    on [NewFileGroup]
    GO
  • Drop_existing de kelime anlamına baktığımızda olan index’i önce drop edip sonra create et demek.
    CREATE INDEX CI1 on tbl1 (Col1)
    with (DROP_EXISTING=ON)
    on [NewFileGroup]
    GO

 

Ama aralarında çok önemli bir fark var

  • Eğer bir Clustered Index’i “Create with Drop_Existing” metodu yerine “drop&create” metodu ile tekrar create edersek tüm nonclustered index’ler 2 defa rebuild olur. Bunun sebebi ilk drop işleminde tüm nonclustered index’lerin leaf level page’lerındaki clustered index key’lerin kaldırılıp Heap Row Pointer bilgilerinin konulması, tekrar create edildiğinde de yeni clustered index’in key bilgilerinin tekrar tüm nonclustered index’lerin leaf level page’lerine yazılmasıdır. (Clustered Index key’lerinin nonclustered index’lerin leaf level’inde olması lookup’ların yapılabilmesi içindir. Daha detaylı bilgi için şu makaleyi inceleyebilirsiniz.)

    Bu davranış aşağıdaki msdn article’da şu şekilde açıklanıyor;

    Sometimes indexes are dropped and re-created to reorganize the index, for example to apply a new fillfactor or to reorganize data after a bulk load. It is more efficient to use CREATE INDEX and the WITH DROP_EXISTING clause for this, especially for clustered indexes. Dropping a clustered index causes all the nonclustered indexes to be rebuilt. If the clustered index is then re-created, the nonclustered indexes are rebuilt once again to replace the row pointers with clustered index keys. The WITH DROP_EXISTING clause of CREATE INDEX has optimizations to prevent this overhead of rebuilding the nonclustered indexes twice. DBCC DBREINDEX can also be used and has the advantage that it does not require that the structure of the index be known.
    http://msdn.microsoft.com/en-us/library/aa258837(SQL.80).aspx
  • Olaya nonclustered index açısından bakarsak; bir nonclustered index’in drop_existing metodu yerine drop&create metodu ile tekrar create edilmesi daha fazla IO yapılmasına ve dolayısıyla daha uzun sürmesine sebebiyet veriyor. Bunun nedeni; işlem drop&create metodu ile yapıldığında index tekrar create edilirken index page’ler tüm tablo okunarak oluşturuluyor. Drop_Existing metodu ile yapıldığında ise hali hazırda olan page’ler kullanılıp sadece index’in filegroup’u değiştiriliyor. Tüm tablo okunmadığı için drop_existing metodu bize daha performanslı bir sonuç vermiş oluyor. Tabi tanımlama olarak tamamen aynı index’i tekrar oluşturduğumuzu varsayarsak.

    Bu konuda www.sqlservercentral.com daki bir makalede detaylı bir analiz yapılmış. Drop_existing, drop&create ve rebuild işlemlerinin yaptıkları IO ve operasyon süreleri tablo halinde karşılaştırılmış. Detaylı bilgiye şu makaleden erişebilirsiniz.

 

Sonuç olarak özellikle Index filegroup değişimlerinde drop_existing metodunu tercih etmenizi tavsiye ederim. aynı işi boşu boşuna daha fazla kaynak tüketerek yapmanın bir anlamı yok değil mi? :)

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan