Aynı SQL Server 2005 örneğinde çalışan hemen hemen aynı iki sorgu var:
- Birincisi
SELECT
LINQ tarafından oluşturulan orijinal sorgudur (Biliyorum, biliyorum ... Ben uygulama geliştiricisi değilim, sadece DBA :). - İkincisi, birincisi ile tamamen aynıdır
OPTION (RECOMPILE)
, sonunda bir a eklenmiştir .
Başka hiçbir şey değiştirilmedi.
Birincisi her çalıştırıldığında 55 saniye sürer.
İkincisi 2 saniye sürer.
Her iki sonuç kümesi de aynıdır.
Bu ipucu neden performansta bu kadar dramatik bir kazanç sağlar?
Üzerindeki Çevrimiçi Kitaplar girişi RECOMPILE
çok ayrıntılı bir açıklama sunmuyor:
SQL Server Veritabanı Altyapısı'na, sorgu için oluşturulan planı yürüttükten sonra atmasını söyler ve sorgu optimize ediciyi bir sonraki sorgu çalıştırıldığında bir sorgu planını yeniden derlemeye zorlar. RECOMPILE belirtmeden, Veritabanı Altyapısı sorgu planlarını önbelleğe alır ve yeniden kullanır. Sorgu planları derlenirken, RECOMPILE sorgu ipucu sorgudaki yerel değişkenlerin geçerli değerlerini kullanır ve sorgu saklı yordamın içindeyse, geçerli değerler herhangi bir parametreye iletilir.
RECOMPILE, depolanmış yordamın tamamı yerine yalnızca saklı yordam içindeki sorguların bir alt kümesinin yeniden derlenmesi gerektiğinde WITH RECOMPILE yantümcesini kullanan bir saklı yordam oluşturmak için kullanışlı bir alternatiftir. Daha fazla bilgi için, bkz. Saklı Yordamları Yeniden Derleme. RECOMPILE, plan kılavuzları oluştururken de kullanışlıdır. Daha fazla bilgi için bkz. Plan Kılavuzlarını Kullanarak Dağıtık Uygulamalarda Sorguları En İyileştirme.
Sorgum çok sayıda yerel değişken olduğundan, tahminim SQL Server'ı OPTION (RECOMPILE)
sorgu ipucunu kullandığımda (ciddi olarak) optimize edebildiğidir .
Baktığım her yerde insanlar OPTION (RECOMPILE)
bundan kaçınılması gerektiğini söylüyor . Bunun açıklaması genellikle bu ipucunu kullanmanın SQL Server'ın bu exection planını yeniden kullanamaması ve bu nedenle her seferinde yeniden derlemek için zaman kaybetmesi gerektiğidir.
(Ama) Devasa performans avantajı göz önüne alındığında, bu sorgu ipucunu bu sefer kullanmanın iyi bir şey olacağını düşünmeye meyilliyim.
Kullanmalı mıyım? Değilse, SQL Server'ı bu ipucu olmadan ve uygulamayı değiştirmeden daha iyi bir yürütme planı kullanmaya zorlamanın bir yolu var mı?