Upload
sqlserveronculeri
View
1.290
Download
3
Embed Size (px)
Citation preview
Index ve İstatistik
Turgay SahtiyanEurobank Tekfen – Veritabanı YöneticisiMicrosoft MVP – SQL Server
Performansınızı Arttırın
Konuşmacı : Turgay Sahtiyan
SQL Server DBA – Eurobank TekfenKonuşmacı/Yazar/Lider - SQL Server
ÖncüleriE-mail : [email protected] : www.turgaysahtiyan.com
10+ WebcastMS Technet Türkiye - WhitepaperSQLPass Turkey Chapter LeaderMicrosoft MVP – SQL Server
Ajanda
Neden Index ?
Index
Clustered Index – NonClustered Index
Clustered Index’in Önemi
NC Index’lerde Included Column Kullanımı
DMV’ler ile Index Analizi
İstatistik (Stats)
İstatistik Nedir ?
İstatistik Nasıl Oluşur ?
İstatistik Nasıl Güncellenir ?
Veritabanı İstatistik Özellikleri
Neden Index ?
Daha az IO Veriye daha hızlı erişim Table Scan <> Index
Search Tamamlanması saatler
süren bir sorgunun uygun index’ler kullanılarak saniyeler seviyesinde getirilmesi sağlanabilir.
Telefon rehberi Gerekli index’ler faydalı
olduğu gibi çok fazla index kullanımı OLTP işlemlerde performans sıkıntısı doğurur.
Index’lerde B-Tree Yapısı
1 Level Root 1 veya 1’den fazla Intermediate Level 1 Level Leaf
NonLeaf Level
NonLeaf Level Page’ler sadece navigasyon için kullanılır. Veri dönüş işlemi NonLeaf Level Page’lerden değil Leaf Level Page’lerden yapılır.
Index Page’leri Görüntüleme
• DBCC IND ( {'dbname' | dbid}, tablenum, indexnum )
DBCC IND('AdventureWorks','tblIndexDeneme1',1)
Bir Index’in Page’leri
• DBCC PAGE ( {'dbname' | dbid}, filenum, pagenum [, printopt={0|1|2|3} ])
DBCC PAGE('AdventureWorks',1,24044,3)
Bir Page’in İçeriği
• DBCC TRACEON (3604)
Leaf Level Data Page’lerin İçeriğini Görmek İçin
Clustered Index Clustered Index = Fiziksel Index Diskte veriler mantıksal olarak sıralı
tutulurlar. (Page Chain) Bir tabloda sadece 1 adet Clustered Index
bulunabilir. Leaf Level = Datanın Kendisi Ada göre sıralı bir telefon defteri Clustered
Index için iyi bir örnektir.
NonClustered Index Telefon defteri için mesleki bir
index yapmak iyi bir NonClustered Index örneğidir.
Leaf Level = Row Locator + Included Kolonlar
Row Locator Heap ya da Clustered Index durumuna göre farklılık gösterir.
Heap -> Dosya Numarası (File Identifier)
+ Sayfa Numarası (Page Number)
+ Kayıt Numarası (Slot Number)
Clustered Index -> Clustered Index Keys
+ (UNIQUIFIER)
Maksimum NonClustered Index Sayısı
SQL Server 2005 – 249 SQL Server 2008 – 999
CL Key’in Veri Tipi (Boyutu) ‘nun Etkisi CL Key’lerin veri tipleri NonClustered
Index boyutunu etkileyen en önemli faktörlerden birisidir.
Diğer önemli faktör, CL’nin composite yani birden fazla key üzerine oluşturulup oluşturulmamasıdır.
Clustered Index Key Açıklaması CL Key Size
Kayıt Sayısı NC Index Sayısı
MB
integer 4 byte 10.000.000 8 305,18
Datetime 8 byte 10.000.000 8 610,35
Datetime + Integer 12 byte 10.000.000 8 915,53
Guid 16 byte 10.000.000 8 1.220,70
Composite 32 byte 10.000.000 8 2.441,41
Composite 64 byte 10.000.000 8 4.882,81
10 Milyon kayıda ve 1 CL, 8 NC index’e Sahip Tablo Örneği
Kaynak : Kimberly L. Tripp – www.sqlskills.com
CL Key’in Veri Tipi (Boyutu) ‘nun Etkisi
Clustered Index Key Açıklaması CL Key Size
Kayıt Sayısı NC Index Sayısı
MB
integer 4 byte 100.000.000
12 4.577,64
Datetime 8 byte100.000.00
012 9.155,27
Datetime + Integer 12 byte 100.000.000
12 13.732,91
Guid 16 byte 100.000.000
12 18.310,55
Composite 32 byte 100.000.000
12 36.621,09
Composite 64 byte 100.000.000
12 73.242,19
Peki ya 100.000.000 kayıt ve 12 NC var ise?
Kaynak : Kimberly L. Tripp – www.sqlskills.com
+70 GB’ın getirdiği yük• Disk• Memory• Backup• Insert / update performansı
Clustered Index Kriterleri• Unique
• Olmazsa: UNIQUFIER (4byte)• Static
• Olmazsa: Update’ler NC’lerde de yapılır, CL’de Page Split’e ve Fragmantasyona sebep olur.
• Küçük Boyutlu• Olmazsa: NC’lerde gereksiz alan kullanımı
• Non-Nullable• Olmazsa: 3 byte’lık gereksiz alan kullanımı
• Sürekli Artan• Olmazsa: Page Split ve Fragmantasyona sebep olur.
Identity
NC Index’lerde Included Kolon Kullanımı SQL Server 2005 ile gelen bir özelliktir. Amaç sorguyu cover edip lookup yapmamaktır. Covering Index : Lookup yapma ihtiyacı olmadan
istenen tüm bilgileri leaf level page’lerinde bulunduran NonClustered Index’lerdir.
Included kolonlar sadece Leaf Level Page’lerde bulunur.
Composite Index25.21 MB
% 1Included Column Index
25.02 MB
DMV’ler ile Index Analizi
•Index Kullanım İstatistikleri
•Kullanılmayan Index’ler
•Fragmante Olan Index’ler
•Eksik Index (Missing Index) Analizi
Index Özet
Index = Horse PowerClustered - NonClustered
IndexIndex’lerde B-Tree YapısıIndex MaintenanceIndex Kullanım
İstatistiklerinin AnaliziEksik Index Analizi
İstatistik Nedir ? AdventureWorks.Person.Address
AddressID – Clustered Index City – NonClustered Index
26 satır NonClustered Index Seek + LookUp
141 Satır Clustered Index Scan
İstatistik Nedir ? Tabloda bulunan verilerin
dağılımını gösterir.
Sorgu planı (Query Plan) oluşturulurken kullanılır.
Estimated Rows’u bulmaya yarar.
Hangi Index’e hangi yöntem ile erişileceğini belirlemek için kullanılır.
Kayıtları okumadan ne kadar kaydın döneceğini tahminlemek ancak İstatistik kullanımı ile mümkündür.
İstatistik Güncel Olmasının Önemi İstatistik delete-insert-update modifikasyon
işlemleri ile güncelliğini yitirir.
Doğru tahminleme yapabilmek için istatistiğin olması kadar güncel olması da çok önemlidir.
DEMO
İstatistik Nasıl Oluşur ?
Index oluşturulduğu zaman. (Bu şekilde oluşan istatistiklerin ismi Index’in ismi ile aynıdır.)
Composite Index >> Sadece ilk kolon
Auto_Create_Statistics
İstatistik CREATE STATISTICS komutu ile manuel olarak oluşturulabilir. 8 MB’dan küçük ise Full Scan 8 MB’dan büyük ise Random Record
İstatistik Nasıl Güncellenir İstatistiğin güncellenme tarihine bakmak için;
sp_autostats DBCC SHOW_STATISTICS STATS_DATE
İstatistiği manuel güncellemek için; UPDATE STATISTICS sp_updatestats (sysindexes.rowmodctr değerine göre karar
verilir.)
Auto_Update_Statistics
Auto_Update_Statistics_Aysnc
Index Rebuild
DBCC SHOW_STATISTICS DBCC SHOW_STATISTICS ('Person.Address',IX_City) Range_Rows : x kayıdı ile histogramdaki bir
önceki değer arasında bulunan kayıt sayısını verir.select * from Person.Address where City>'Bonn' and City<'Bottrop‘
EQ_Rows : City kolonu x olan kayıt sayısını verir.select * from Person.Address where City='Bottrop‘
Distinct_Range_Rows : x ile bir önceki kayıt arasındaki tekil City sayısını verir.select City from Person.Address where City>'Bonn' and City<'Bottrop' group by City
Avg_Range_Rows : x ile bir önceki kayıt arasındaki kayıtların her birine düşen ortalama (tahmini) kayıt sayısını verir.
Maksimum 200 step olabilir. 200 Step’in yetmediği durumlarda Filtered Stats ile
daha detaylı istatistikler oluşturulabilir. (SS 2008)
Veritabanı İstatistik Özellikleri Auto_Create_Statistics
Aktif ise where bloğunda kullanılan kolonlar için otomatik olarak istatistik oluşturulur.
Bu özellik ile otomatik olarak oluşturan istatistikler _WA_ ön eki ile başlar.
Auto_Update_Statistics İstatistik, tablodaki kayıtların %20+500 adedi
değiştikten sonra ilk kullanılmak istendiğinde güncellenir.
Kaç kaydın güncellendiği bilgisi sysindexes.rowmodctr kolonunda tutulur.
İstatistiğin çok sık güncellenmesi ReCompile’dan dolayı performans sıkıntısına sebep olabilir.
Auto_Update_Statistics_Aysnc Auto_Update_Statistics ile beraber çalışır. İstatistik güncellenme işleminin asenkron olarak
gerçekleşmesini sağlar. Sorgular istatistik güncellenme işlemini beklemedikleri
için performans artışı sağlar.