Recent comments

İç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-2011
Takvim
<<  May 2012  >>
MoTuWeThFrSaSu
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910
Keywords

Insert,Update,Delete işlemlerinde tablonun üzerinde bulunan her index’in update görme ihtimali vardır. Dolayısıyla tablo üzerinde ne kadar çok index var ise DML işlemlerinin performansı o kadar düşecektir.

Bugün sizler ile paylaşacağım script ile kolon sayısından daha fazla index’e sahip tabloları listeleyeceğiz.

More...

SQL Server’da 900 byte’ı geçen varchar kolonlar üzerine Index tanımlaması yapılabilmektedir. Fakat böyle bir index’e 900 byte’dan daha büyük bir kayıt insert’i ya da update’i yapıldığında hata alınacaktır. Bu yüzden Index Key toplamı 900 byte’dan büyük olan Index create etmemeye özen göstermekte fayda vardır.

More...

SQL Server 2012’den önceki versiyonlarda varchar(max), nvarchar(max) ya da varbinary(max) tipinde kolon içeren index’lerde create ya da rebuild gibi online Index operasyonları yapılamıyordu. SQL Server 2012 ile beraber artık bu işlemleri yapabileceğiz.

More...

İstatistiklerin Query Plan oluşturulması aşamasında üstlendikleri rolü SQL Server’da İstatistik Kavramı adlı makalemde detaylı olarak incelemiştik. Güncel olmayan istatistiklerin yanlış Query Plan’lar oluşturulmasına dolayısıyla performans sıkıntısına sebebiyet verdiğini belirtmiştik. Bu yüzden Auto_Update_Statistics gibi istatistiklerin otomatik olarak güncellenmesini sağlayan parametrelerin aktif yapılmasının çoğu ortam için oldukça önemli olduğunun özellikle üzerinde durmuştuk.

İstatistikler güncellendikten sonra sorgular Recompile edilir. (Sorguların ReCompile edilme nedenlerine şu makaleden erişebilirsiniz.) Fakat eğer tablo update görmesine rağmen istatistiğin dağılımında çok fazla değişiklik olmuyorsa bu durumda boşu boşuna istatistiği update etmeye ve sorgunun ReCompile edilmesini tetiklemeye gerek yoktur.

Bu makalemde Index create edilirken verilen STATISTICS_NORECOMPUTE parametresi ile create edilen Index’e bağlı istatistiğin otomatik olarak update edilmesinin nasıl engellendiğini görüyor olacağız.

More...

23.11.2011 tarihinde gerçekleştirmiş olduğum SQL Server Performans İpuçları başlıklık webcast’imin videosuna ve diğer dosyalarına aşağıda erişebilirsiniz.

 

 

23 Kasım Çarşamba günü yapacağım webcast’in duyurusunu yapmak istiyorum.

SQL Server Performance Tuning İpuçları başlıklı webcast’im 23.11.2011 tarihinde 21:00-22:00 saatleri arasında gerçekleşecek.

Aşağıdaki url’i kullanarak vereceğim bu webcast’e katılabilirsiniz.

https://www.livemeeting.com/cc/mvp/join?id=6N4JP9&role=attend&pw=2NM%7E%60JK%7Bt

Webcast süresince şu performans ipuçları üzerinde duracağız.

  1. FILLFACTOR – PAD_INDEX
  2. Filtered Index
  3. Indexed View
  4. Filtered Index vs Indexed View
  5. NC Index’lerde Included Kolon Kullanımı
  6. Index Seek : PT Bitti mi?
  7. Where Bloğunda Case Kullanımı
  8. Where Bloğunda Collate Kullanımı
  9. Eksik Index (Missing Index) Analizi
  10. Index Maintenance
  11. İstatistiğin Güncel Olmasının Önemi
  12. Optimize For Ad Hoc Workloads
  13. Instant File Initialization
  14. Veritabanı Dosya Büyümeleri

 

Not:Katılım url’i webcast başlamadan yarım saat önce aktif hale gelecektir.

 

İyi Çalışmalar

Turgay Sahtiyan

Where Bloğunda Case Kullanmayın makalemden sonra ikinci “kullanmayın” makalem ile karşınızdayım :) Bu makalemde where bloğunda kullanılan “Collate” anahtar kelimesinin performansa olan etkisini örnekler ile inceleyeceğiz.

More...

SQL Server’da Index’lere erişim açısından 2 yöntem kullanılmaktadır. Bunlar; Index Seek ve Index Scan yöntemleridir. Index Scan, Index’in Leaf Level page’lerinin tamamının ya da belli bir range’inin okunması anlamına gelirken, Index Seek, B-Tree üzerinden arama gerçekleştirerek ilgili kayıt ya da kayıtlara erişilme yöntemidir. Bu yüzden performans çalışması yapan bizler Index Scan’den ziyade Index Seek görmek isteriz.

Peki Index Seek yapıldığı zaman performans çalışmalarımız bitmiş mi oluyor? Daha yapacak başka bir şeyimiz kalmadı mı?

More...

Keskin bir ifade oldu farkındayım :) O yüzden cümlenin başına “çok zorda kalmadıkça diye” ekleyelim. Kullanmayın deme sebebim ise where bloğunda case kullanımı, istatistikler üzerinden estimated rows hesabı yapılırken yanlış hesaplamalar yapılmasına dolayısıyla da estimate edilecek kayıt sayısının doğru tahminlenememesi anlamına gelmektedir. Bu durumda da Query Plan sağlıklı bir şekilde oluşturulamayacak ve gereksiz IO yapılmasından dolayı performans sıkıntısı ortaya çıkacaktır. Bugünkü yazımda bahsettiğim bu konuyu örnekler ile görüyor olacağız.

More...

Index oluşturulurken kullanılan FILLFACTOR ve PAD_INDEX seçenekleri ile daha sonra yapılacak DML işlemleri için Index sayfalarında (Page) ne kadar boş yer bırakılacağı belirlenebilir. Özellikle çok hızlı bir şekilde Fragmante olan Index’ler için bu değerler üzerinde oynama yapılmasında fayda olabilir. Fakat bu değerlerde yapılacak değişikliklerin sayfa sayısını arttıracağını ve dolayısıyla yapılacak IO miktarını arttıracağını unutmamak gerekir.

More...

Son 2 makalemde Filtered Index ve Indexed View konularına değindim. Bazı senaryolarda kullanım noktaları kesişen bu özelliklerin aralarındaki benzerlikler ve farklar hangi çözümün kullanılması gerektiği noktasında belirleyici olabilir.

More...

Bu makalemde, özellikle DWH sistemlerde bulunan, bol join ya da hesaplama içeren, çok fazla kayıt döndüren sorgularda ciddi performans artışı sağlayan Indexed View’leri inceliyor olacağız.

More...

turgay sahtiyan , 27. October 2011, 08:00

Filtered Index, SQL Server 2008 ile gelen, optimize edilmiş bir nonclustered index’tir. Oluşturulurken kullanılan where anahtar kelimesi sayesinde index key’in bütün verilerini değil sadece alt kümesini içerir. İyi tanımlanmış bir Filtered Index performansı arttırabilir, bakım maliyetini düşürür, aynı zamanda filtered olduğu için diskte daha az yer kaplar.

Filtered Index’in sağladığı avantajları detaylı olarak analiz etmek gerekirse;

  • Filtered Index Sorgu Performansını Arttırır : Filtered Index normal Index’e oranla daha az data içerdiği için bu Index üzerinden yapılacak seek/scan işlemleri normal Index üzerinden yapılacak seek/scan işlemlerine oranla daha performanslı çalışacaktır. Ayrıca Filtered Index için otomatik olarak oluşacak olan istatistik te veriyi daha iyi temsil edeceğinden estimated rows daha iyi tahmin edilecek, dolayısıyla da Index’e erişim metodu daha iyi belirlenebilecektir.
  • Index Bakım Maliyetlerini Düşürür : Index fragmante olduğu zaman bakım yapılarak bu fragmantasyonun giderilmesi gerekir. (Detaylı bilgi için şu makaleyi inceleyebilirsiniz.) Index fragmantasyonu tabloda DML işlemleri olduğu zaman oluşur. Filtered Index normal NonClustered Index’e oranla daha az veri içerdiği için fragmante olma ihtimali daha azdır. Ayrıca fragmante olsa dahi bakım işlemi sırasında daha az data ile uğraşılacağı için bakım maliyeti her halukarda normal index’e oranla daha az olacaktır.
  • Disk Maliyetini Düşürür : Daha önceki maddelerde de belirttiğim gibi Filtered Index datanın tamamını içermediği için normal Index’e oranla daha az yer kaplar.

Teorik kısmı burada kesip Filtered Index’i kafamızda daha iyi canlandırmak amacıyla canlı bir örnek verelim. Örneğin tbl1 isimli tablonuzda bulunan col1 adlı kolona index tanımlaması yapıyorsunuz. Tablo toplamda 1000 kayıttan oluşuyor. Fakat bu 1000 kaydın 700’ü için col1 kolonunda NULL bilgisi bulunuyor. Siz Col1 üzerinden yaptığınız bütün aramalarda null olmayan bir değer ile arama yapıyorsunuz. Böyle bir senaryoda col1’in tüm değerleri için Index tanımlamak yerine NULL olmayan satırlar için Index tanımlamanız daha anlamlı olacaktır. Bu şekilde 1000 değerden oluşan bir Index yerine 300 değerden oluşan bir Index olacak, bunun neticesinde B-Tree küçülecek ve Index üzerinden yapılan aramalar daha performanslı olacaktır. Ayrıca Index bütün kayıtlar için değil sadece 300 kayıt için oluştulduğu için diskte daha az yer kaplayacak ve Index maliyeti de otomatikman düşecektir.

Şimdi yukarıda bahsettiğim örneği SQL Server’da gerçekleştirelim ve 2 Index arasındaki farklara bakalım.

Bunun için ilk olarak 1.000.000 satırdan oluşan bir tablo oluşturacağım ve 700.000 kaydın col1 kolonuna null değer atacağım. Kalan 300.000 kaydın col1 kolonunu NewID() fonksiyonundan gelen GUID değeri ile dolduracağım.

--Bir çalışma DB'si oluşturuyoruz.
create database DBFilterIndex
GO
use DBFilterIndex
GO
--Bir çalışma tablosu oluşturuyoruz.
create table tbl_FilterIndex (ID int Identity(1,1), col1 varchar(37))
GO
--col1 bilgisi NULL olan 700.000 kayıt insert ediyoruz.
insert tbl_FilterIndex
  select null
go 700000  
--col1 bilgisi NULL olmayan 300.000 kayıt insert ediyoruz.
insert tbl_FilterIndex
  select cast(NEWID() as varchar(37))
go 300000  

 

1.000.000 kayıttan oluşan çalışma tablomuz hazır. Şimdi Index’leri oluşturalım.

--ID kolonu üzerine Clustered Index oluşturuyoruz
create clustered index CIX on tbl_FilterIndex (ID)
GO
--col1 için normal bir NonClustered Index oluşturuyoruz
create nonclustered index IX_RegularIndex on tbl_FilterIndex (col1)
GO
--col1 için Filtered NonClustered Index oluşturuyoruz
create nonclustered index IX_FilterIndex on tbl_FilterIndex (col1)
	where col1 is not null
GO

 

Şimdi 2 Index’i birbiri ile karşılaştırabiliriz.

İlk olarak 2 index’in kayıt sayılarını ve boyutlarını karşılaştıralım.

SELECT i.index_id, i.name, i.type_desc, ps.reserved_page_count, ps.used_page_count, 
	ps.reserved_page_count*8 as Size_KB,
	ps.row_count, i.filter_definition 
FROM sys.dm_db_partition_stats ps
INNER JOIN sys.indexes i ON ps.object_id = i.object_id AND ps.index_id = i.index_id
WHERE ps.object_id = OBJECT_ID('tbl_FilterIndex')

 

1

Resimde de gördüğünüz üzere normal NonClustered Index 1.000.000 kayıttan oluşurken Filtered Index’te null olan kayıtlar bulundurulmadığı için 300.000 kayıttan oluşmakta. Bu yüzden normal index 22 MB iken Filtered Index 15 MB boyutunda. Disk açısından maliyetin nasıl düşürüldüğünü görmüş olduk.

Şimdi bir de performans karşılaştırması yapalım. Bu karşılaştırma için aynı sorguyu 2 farklı index’i force ederek yapacağım. Aynı zamanda farkı daha net görebilmnek adına Index’i scan edecek bir kriter gireceğim.

SET STATISTICS IO ON
--Normal NonClustered Index'i force ederek
select * from tbl_FilterIndex WITH (INDEX=IX_RegularIndex)
where col1=NEWID()
--Filtered Index'i force ederek
select * from tbl_FilterIndex WITH (INDEX=IX_FilterIndex)
where col1=NEWID()

 

IO karşılaştırmasına baktığımızda normal Index sorguyu tamamlamak için 2749 IO yaparken Filtered Index aynı sorguyu 1879 IO yaparak getirebilmekte.

2

Query Plan’ları karşılaştırarak maliyetlere bakacak olursak;

3

Resimde de görüldüğü üzere normal Index’in maliyeti 4 kat daha fazla. Bu örneklerle de Filtered Index’in performansa olan etkisini görmüş olduk.

Filtered Index’te desteklenen özelliklere bakacak olursak;

  • Filtered Index’in kriteri değiştirilebilir.
  • Missing Index DMV’leri Filtered Index önerisi toplamaz.
  • Database Engine Tuning Advisor “not null” Filtered Index önerisi sunabilir.
  • Filtered Index, online Index operasyonunu destekler. Yani Filtered Index’ler online olarak Rebuild edilebilirler.
  • Table Hint’ler Filtered Index tarafından desteklenir.

SQL Server 2008 ile beraber gelen Filtered Index özelliği Performance Tuning çalışmaları yapılırken göz önünde bulundurulması gereken güzel özelliklerden biri. Filtered Index sayesinde verinin alt kümesi için Index tanımlaması yapılarak performans artışı sağlanabilir.

Daha önce SQL Server’da Index Kavramı adlı makalemde ve web seminerimde üzerinde durduğum konuyu bu makalede biraz daha detaylandırmak istiyorum.

More...

29.09.2011 tarihinde gerçekleştirmiş olduğum SQL Server’da Index Kavramı - Performance Tuning ve Query Optimization başlıklı webcast’imin videosu aşağıdadır.

More...

Nisan ayında yaptığım “SQL Server’da Index Kavramı–Performance Tuning ve Query Optimization” başlıklı web seminerimi SQL Server Öncüleri topluluğu altında perşembe günü tekrar yapıyorum.

İlgili duyuruya aşağıdaki linkten erişebilirsiniz.

http://www.sqlserveronculeri.com/10/EventSchedule/191/sql-server’da-index-kavrami--performance-tuning-ve-query-optimization-web-semineri.aspx

Kayıt olmak için aşağıdaki bağlantıyı kullanabilirsiniz.

https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032495105&culture=tr-TR

SQL Server 2011 Denali’nin ilk çıkan CTP’sinde anons edilen ColumnStore Index tipi özellikle DWH sistemleri için heyecan yaratmıştı. Bazı sorgularda 16 kata kadar iyileştirme sağladığı söylenen ColumnStore Index için ben de şu makaleyi yazmıştım.

CTP1 versiyonunda ColumnStore Index kullanımı olmadığı için sadece duyduklarımızla yetinirken CTP3’ün çıkmasıyla beraber artık ColumnStore Index’i denemeye başlayabiliriz.

More...

12.04.2011 tarihinde gerçekleştirmiş olduğum SQL Server’da Index Kavramı - Performance Tuning ve Query Optimization başlıklı webcast’imin videosu aşağıdadır.

Webcast’te kullandığım sunum dosyası ve scriptleri şuradan ulaşabilirsiniz.

İyi seyirler

Turgay Sahtiyan

 

Bugünkü makalemde, heap tablolarda karşımıza çıkan Forwarded Record konusu üzerine konuşuyor olacağız. Alt başlıklarımız şu şekilde;

  • Forwarded Record Nedir?
  • Forwarded Record Nasıl Oluşur?
  • Forwarded Record Neden Oluşur? SQL Server’ın Bu Davranışının Nedeni Nedir?
    • NonClustered Index İçeren Heap Tablolarda Forwarded Record
    • NonClustered Index İçermeyen Heap Tablolarda Forwarded Record
  • Forwarded Record’un Performansa Etkisi Nedir?
  • Clustered Index İçeren Tablolarda Neden Forwarded Record Oluşmaz?
  • Hangi Tablolarımda Forwarded Record Var?
  • Tablolarımda Bulunan Forwarded Record’lardan Dolayı Performans Sıkıntısı Yaşıyor muyum?
  • Forwarded Record Nasıl Düzeltilir?
  • Sonuç

More...

Kimberly L. Tripp’in SQL Server’da Partitioning kullanımı üzerine yazmış olduğu çok güzel bir whitepaper.

Kesinlikle okumanızı tavsiye ederim.

http://www.sqlskills.com/resources/Whitepapers/Partitioning%20in%20SQL%20Server%202005%20Beta%20II.htm

İyi çalışmalar

Turgay Sahtiyan