8 Temmuz 2014 Salı

Bir hikaye: Ahh şu yazılımcılar yok mu… Başımızın tatlı belaları!

Merhabalar,

Sanırım 1 ayı geçmiştir, özel bir firmadan, SQL Server ile ilgili olduğunu düşündükleri bir sıkıntı nedeniyle yardım çağrısı geldi. Durumun acil olduğunu söylediler ve ben de nasıl olduysa üşenmedim ve akşam 19.00 civarı gittim yanlarına. Size bu hikayeyi anlatmak istiyorum. Tabii ki beni arayan arkadaşımın ve şirketin bilgileri bende saklı.

Firmaya gittiğimde 2 arkadaş karşıladılar ve sorundan bahsettiler. Kullanmaya yeni başladıkları bir uygulama ile ilgili yavaşlık sorunu yaşıyorlardı, ama ne olduğunu bilen yoktu. Kullanıcı algısına göre önceki uygulamaları jet hızıyla çalışıyordu; fakat ne olduysa yeni uygulamaya geçtikten sonra birçok şey çok yavaşlamıştı, acaba sorun SQL Server olabilir miydi?

Durumu incelemeye başladık, Trace açtık, Log'ları inceledik… Bazı sorgular nispeten ağır çalışıyorlardı, Index'lerinin olmadığını gördük ve bunları oluşturduk; fakat en can alıcı şey, veritabanlarının AUTO_CLOSE özelliğinin ON oluşuydu. Üretim ortamlarındaki veritabanlarında neredeyse ASLA olmaması gereken bir durum. Bu bir 3. parti paket uygulama, yani başka bir şirket geliştirmiş. Muhtemelen o şirketteki yazılımcı arkadaşlar SQL kod geliştirme ortamı olarak SQL Server Developer Edition yerine SQL Server Express Edition kullanıyorlar. Çünkü AUTO_CLOSE özelliği Express Edition'larda varsayılan olarak ON!

Gerekli Index'leri oluşturduktan sonra ve en önemlisi de veritabanlarının AUTO_CLOSE özelliklerini ON yaptıktan sonra Pazartesi gününü bekledik ve kullanıcılar tarafından uygulamanın kabul edilebilir bir hızla çalıştığı bilgisini aldım.

Başka bir gün, yine aynı arkadaşlarımdan yine bir yardım çağrısı geldi ve ilk fırsatta uğradım yanlarına. Bu sefer sorun, belli ekranlarda yaşanan kayda değer bir yavaşlıkla ilgiliydi. Sorunu beraber inceledik ve bu sefer sorunun SQL Server ile hiçbir ilgisi yoktu. Sorun tamamen uygulama arayüzü tasarımı ile ilgiliydi. Şöyle ki, ekranda son kullanıcıya gösterilemek istenen veri SQL Server'dan 200 milisaniyede alınırken, arayüzde gösterilebilmesi 15-18 saniye sürüyordu! İnanabiliyor musunuz? Peki bu nasıl başarılabilmiş dersiniz? Uygulama arayüzünde bol bol Checkbox kullanarak böyle bir şey yapılabiliyor! Bu cümlemden Checkbox'ların ne kadar çok olduğunu ne kadar tahmin edebilirsiniz bilemiyorum, ama rahatça 50'den fazlaydı diyebilirim. Sorun tabii ki sadece Checkbox'lar da değildi, aynı zamanda Tab Control bileşeni de kullanılmış ve veritabanından yapılan sorgulama bu bileşendeki 10'dan fazla sekmedeki Datagridview'lere ve Checkbox'lara dağıtılıyor. Veriyi sorgulamak 200 milisaniye, ekranda gösterimi ise ortalama 17 saniye!

Aman yazılımcı arkadaşlarım, siz siz olun lütfen ekran tasarımını yabana atmayın. Tasarladığınız ekranlarda son kullanıcının yapabileceği veri girişini, veritabanındaki tablolarınızın tasarımını düşünerek kısıtlayın, iki tarafın da birbiriyle tutarlı olmasını sağlayın. Lütfen ama lütfen NULL olmaması gereken tablo alanları için veri girişi yapılan kullanıcı arayüzlerini NULL girilemeyecek şekilde tasarlayın ki sonra ISNULL veya COALESCE'lerle dolu sorgular görmeyelim ki sorgu performansımız kötü olmasın. Lütfen ekran tasarlarken yukarıdaki tecrübeyi de göz önünde bulundurun ki veritabanından 200 milisaniyede gelen sorgu için kullanıcılar 17 saniye beklemesin. Ekran tasarımı hakkında söylenebilecek daha nice şey var, ama akla ilk gelen en önemlileri bunlar.

Kolay gelsin,
Ekrem Önsoy