Execution Planda Spool Kavramı(Eager Spool, Lazy Spool)
Execution Planda bazen Eager Spool, Lazy Spool gibi operatörler görüyoruz. Bu makalede bu operatörlerin ne iş yaptığına değineceğiz. Eager Spool ve Lazy Spool mantıksal operatörlerdir. Genelde bu ifadeleri Index Spool, Table Spool, Window Spool ve Row Count Spool gibi fiziksel operatörlerle beraber görürüz.
Bu operatörlerin amacı nedir ve execution planda ne zaman görürüz?
- Eğer çekilen veriye daha sonra tekrar ihtiyaç duyulacaksa;
Eğer sql server sorgunun çalışma esnasında aynı veriye(bir hesaplama sonucunda ortaya çıkan veri gibi) tekrar ihtiyaç duyacaksa bu veriyi tempdb altında bir work table oluşturarak onun içine atar. Ve sorgunun çalışma esnasında bu veriye tekrar ihtiyaç duyulduğunda bu work table’dan veri çekilir.
- Verinin orijinal kaynağından uzak tutulması gerektiğinde;
Bir çoğunuz Halloween senaryosunu duymamışsınızdır. Bu sorun 1976’da keşfedilmiş. Veritabanında bir update sonrasında row’un fiziksel lokasyonunun değişmesi.
Hallowen cadılar bayramı demektir. Cadılar bayramında bir şirket geliri 25000$’dan az olanlara %10 zam yapmak için bir sorgu çalıştırmış ve sorgu düzgün bir şekilde çalışmış fakat sorgunun sonunda veritabanında bulunan herkes’in maaşı 25000$ olmuş. Çünkü 25000$ limitine ulaşana kadar sorgu zam yapmaya devam etmiş. Bu yüzden bu soruna Hallowen problemi denmiş. SQL Server’da Hallowen Protection ile veriyi orijinal lokasyonundan ayrı bir yerde tutarak(spool operatörleri ile) bu sorunun olmasını engelleyen bir mekanizmaya sahip.
Mantıksal Operatörler
Eager Spool |
Eager Spool ve Lazy Spool’un her zaman diğer fiziksel spool operatörleri ile birlikte görüldüğünü söylemiştik. Eager Spool bir önceki operatörden bir talep geldiğinde bütün satırları tek seferde alır ve tempb’ye atar. (Hallowen senaryosunda görebilirsiniz.) |
Lazy Spool |
Lazy Spool bir önceki operatörden bir talep geldiğinde sadece o satırı alır ve tempdb’ye atar. (Nested Loop operatör’ünde satır satır okuma işlemi yapıldığı için görebilirsiniz.) |
Bazen uzun tsql kodlarında ya da stored procedure’lerde spool’ları çok fazla görürüz. Bir kere uygulamacı bir arkadaşın yazdığı bir sorgu bu spool’lar sebebiyle tempdb’yi doldurmuştu. Bunu nasıl tespit ettiğimi anlamak için önce “Tempdb Veritabanını Dolduran Sorgular” isimli makalemi okumalısınız.
Yukarıda belirttiğim makaleyle Internal olarak oluşturulan nesnelerin tempdb’yi doldurduğunu görmüştüm. Tempdb’yi dolduran sorguları gösteren script ile de hangi sorgunun tempdb’yi tükettiğini gördüm ve ilgili kişiye ulaşarak script’ini düzenlemesini söyledim. Benim durumumda bu kişi 3 ayrı veritabanından 10 dan fazla tablodan veri çekerek son 3 yıla ait bir rapor üretmeye çalışıyordu. Aynı sorguyu 3 er aylık periyotlarla çalıştırdığında sorunumuz çözüldü.