2. SQL Server DBA – Eurobank Tekfen
Konuşmacı/Yazar/Lider - SQL Server Öncüleri
E-mail : turgay@turgaysahtiyan.com
Blog : www.turgaysahtiyan.com
10+ Webcast
MS Technet Türkiye - Whitepaper
SQLPass Turkey Chapter Leader
Microsoft MVP – SQL Server
3. Index
Neden 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
4. 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.
5. 1 Level Root
NonLeaf Level
1 veya 1’den fazla Intermediate Level
1 Level Leaf
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.
6. Bir Index’in Page’leri
• DBCC IND ( {'dbname' | dbid}, tablenum, indexnum )
DBCC IND('AdventureWorks','tblIndexDeneme1',1)
Bir Page’in İçeriği
• DBCC PAGE ( {'dbname' | dbid}, filenum, pagenum [, printopt={0|1|2|3} ])
DBCC PAGE('AdventureWorks',1,24044,3)
Leaf Level Data Page’lerin İçeriğini Görmek İçin
• DBCC TRACEON (3604)
7. 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.
8. 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
9.
10 Milyon kayıda ve 1 CL, 8 NC index’e Sahip Tablo Örneği
Clustered Index Key Açıklaması CL Key Kayıt Sayısı NC Index MB
Size Sayısı
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
Kaynak : Kimberly L. Tripp – www.sqlskills.com
10. Peki ya 100.000.000 kayıt ve 12 NC var ise?
Clustered Index Key Açıklaması CL Key Kayıt Sayısı NC Index MB
Size Sayısı
integer 4 byte 100.000.000 12 4.577,64
Datetime 8 byte 100.000.000 12 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
Kaynak : Kimberly L. Tripp – www.sqlskills.com
+70 GB’ın getirdiği yük
• Disk
• Memory
• Backup
• Insert / update performansı
11. • 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
12. 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.
%1
Composite Index Included Column Index
25.21 MB 25.02 MB
14. Index = Horse Power
Clustered - NonClustered Index
Index’lerde B-Tree Yapısı
Index Maintenance
Index Kullanım İstatistiklerinin
Analizi
Eksik Index Analizi
15. AdventureWorks.Person.Address
AddressID – Clustered Index
City – NonClustered Index
26 satır
NonClustered Index Seek + LookUp
141 Satır
Clustered Index Scan
16. 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.
17. İ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
18. 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
19. İ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
20. 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)
21. 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.