31 Mart 2023 Cuma

Dönüşüm Hikayeleri 1 - Beklenmedik Kriz: UpdateStats

    S.A. Arkadaşlar,

    Bugün yaşadığımız bir problemi anlatmak istiyorum. Tüm gün vaktimizi alan ve nedenini açıkçası hala kesin olarak bulduk diyemediğimiz fakat çözebildiğimiz bir konuyu anlatmak istiyorum. Test ortamımızda bazı uçlarda aniden bir yavaşlama oldu ve beklenmeyen dönüş süreleri ile karşı karşıya kaldık, zaman zaman timeout'lara düştük, aslında görünürde değişen hiçbir şey yoktu, ama maalesef böyle bir problem vardı. Hazırsak ayrıntılarına geçelim.

     Arkadaşlar bir gün önceden 1-2 uçta bir yavaşlık olduğunu ilettiler, New Relic ile verileri incelediğimizde böyle bir yavaşlamanın o güne has olduğunu tespit ettik, fakat sadece o güne has bir şey olduğunu düşünüp belki yaptığımız bazı işlemler dolayısıyla bir yoğunluk olabileceğini düşünüp üzerinde çok durmadık. Sonraki gün farklı uçlarda da benzer problemler yaşanınca konuya daha ayrıntılı bakmaya karar verdik. İşin sonunda belirli bir sorguda bunun yavaşladığını anladık. Aynı sorguyu direkt olarak sunucu üzerinde çalıştırdığımızda herhangi bir yavaşlık göremiyoruz, fakat kodda bu yavaşlama vardı.

    Yukarıda atladığımız bir nokta ise bu kodumuz legacy projede olan bir kod ve enteresan bir şekilde aynı sorgu, parametre vermeden (parametreleri direkt olarak sorgu içine yerleştirince) çalıştırdığımızda her şey yolunda gözüküyor. Gerekli parametreleri güvenli bir şekilde eklediğimizde ise bu hata tekrar meydana geliyordu.

    Ayrıca MsSql ve sunucu ortamlarını kontrol ettik, orada herhangi bir darboğaz olmadığını, her şeyin normal olduğunu görüyoruz. Problem git gide çözülemez bir hal almaya başlamıştı.

    Her şey normal görünmesine rağmen bu hatayı almak açıkçası canımızı sıkıyordu. Bununla ilgili bazı aramalar da yapınca farklı çözümler de denemeye başladık ve bunun kronik bir hale gelen bir problem olduğunu sonunda anladık. Bu olay resmi dokümana bile konu almış, fakat biz biraz acı çektikten sonra anlayabildik.

    Sorgumuza manuel olarak Option(Recompile) ekledikten sonra her şeyin o sorgu için normale döndüğünü gördük, fakat problemimiz sadece o sorguda değil başka sorgularda da devam ediyordu. İpin ucunu yakaladığımız için devamını getirmek çok da zor olmadı. Tüm veritabanı için de sp_updatestats komutunu çalıştırarak çözümü elde ettik. Yapılan testler sonucu her şeyin normale döndüğünü görünce rahat bir nefes alabildik.

    Benim adıma yorucu ve güzel bir tecrübe edindiğim bir gün olduğu için bu deneyimimi paylaşmak istedim. Bu problemi çözerken birlikte çalıştığımız takım arkadaşlarım Cihan, Emre ve Gaffar'a da ayrıca teşekkür ederim.

    Konuyla ilgili bazı başlıklara göz atmak isterseniz, buyurun.

https://stackoverflow.com/questions/20864934/option-recompile-is-always-faster-why

https://blog.sqlauthority.com/2019/12/31/sql-server-parameter-sniffing-and-option-recompile/

    Sözü İnşirah suresi 5 ve 6.cı ayetlerle bitirelim.

5.Şüphesiz güçlükle beraber bir kolaylık vardır. 6. Gerçekten, güçlükle beraber bir kolaylık vardır.

Hiç yorum yok:

Yorum Gönder