Neler yeni
Türkiye'nin En Güncel Forum Sitesi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı yada giriş yapmalısınız. Forum üye olmak tamamen ücretsizdir.

Sql Server 2014 Cardinality Estimator

BoluBeyi

Hepinizin Canı Cennete ..!
MFC Üyesi
  • Üyelik Tarihi
    24 Mar 2017
  • Mesajlar
    4,414
  • MFC Puanı
    2,917
  • MFC Seviyesi

Kullandığımız SQL 2012 database lerden birini yeni kurmuş olduğumuz SQL 2014 Always On server a taşıdık. Daha sonra yaptığımız testlerde ise yeni sistemin konfigurasyonunun(CPU, RAM, Ve diğer SQL SERVER best practice lerinin uygulanmış) çok daha iyi olmasına rağmen özellikle bir tabloya insert işlemi yaparken çok daha uzun sürdüğünü hatta zaman zaman Timeout hatasına düştüğümüzü fark ettik. Insert işlemi yapılmaya çalışılan tabloda yaklaşık olarak 1.500.000 kayıt bulunmaktaydı ki, aynı transaction SQL 2012 server da yaklaşık olarak 1 sn civarında gerçekleşirken. Aşağıdaki ekran çıktısından da execution planı görebilirsiniz.


SQL 2014 server da yaklaşık olarak 1.5 dakika civarında sürüyordu. Bir an için acaba SQL 2014 Always on 2 sync replica ve 1 Async replica olması nedeniyle network tarafında bir sıkıntımı olduğunu araştırdığımızda ise herhangi bir network problemi olmadığını anladık. insert işleminin yeni yapıda daha uzun süreceğini hesaplıyorduk ancak bu kadar sürmesi kabul edilemezdi.


Daha sonra yaptığım detaylı incelemede insert yapılan tablodan başka birde yaklaşık olarak 45.000.000 kaydın olduğu diğer bir tablo daha bulunduğunu ve bu iki tablonunda Indexed view oluşturularak join edildiğini buldum.
Sorun da tam olarak bu noktada başlıyordu çünki execution plana göre insert işlemi için büyük tabloda Index scan işlemi yapılıyor bu da çok uzun zaman sürüyordu. Peki SQL 2014 neden böyle bir execution plan oluşturuyordu SQL 2014 ile birlikte Cardinality Estimator ın yeniden geliştirildiğini ve yeni versiyonun daha efektif çalıştığını önceki tecrübelerimden biliyordum ancak belki de Indexed View’ler ile ilgili bir bug olabilirdi ancak internette yaptığım araştırmalarda böyle bir bilgiye ulaşamadım.
Şimdi ise önümde sorunu çözmek için 2 yol kalıyordu
1. Eski Cardinality Estimator I kullanmak
2. Indexed View’i drop edip tekrar normal View oluşturmak

1.Opsiyon ekran çıktısı.

2.Opsiyon ile ilgili ekran çıktısı


1.Opsiyon daha kolay gibi görünsede bence Yeni bir arabaya eski bir motor takmak gibi birşeydi.
bu nedenle bu Indexed View’I kullanlanan tüm sorguları inceleyerek zaten best practice olmayan OLTP sistemlerinde Indexed Viewin drop edilerek tekrar normal View olarak create ettim. Aynı Insert işlemini yaptığımda ise tam olarak istediğimiz gibi çalıştığını ve insert işleminin tekrar 1 snin altında ve daha az IO yaptığının sağlanması ile sorun çözülmüş oldu.
 
Üst Alt