" Geçici İş Yükleri İçin En İyileştir " seçeneğini etkinleştirdiğinizde , 2. kez çalışan geçici sorguların, 1 kadar yavaş olmasına neden olacaksınız, çünkü bir Uygulama Planı Derleyip aynı Verileri çekeceksiniz ( önbellek olmadan) ilk 2 kez.
Bu büyük bir sorun olmayabilir, ancak sorguları test ederken fark edeceksiniz.
Peki, şimdi bu seçenek açılmadan ve 1-Off Ad-Hoc sorgularıyla dolu bir önbellek olmadan ne olacak ?
Önbellek Yönetimi Algoritması:
Bu Optimizasyon özelliği tanıtıldıkça, önbellek yönetimi algoritması da güncellendi.
Kimberly Tripp'in makalesi, Kalen Delaney'in bu algoritma değişikliği hakkındaki yayınına da atıfta bulunuyor .
En iyisini açıklıyor:
Değişiklik aslında SQL Server'ın bellek baskısı olduğunu algıladığı bir plan önbellek boyutunu hesaplar ve planları önbellekten kaldırmaya başlar. Kaldırılacak planlar, yeniden kullanılmamış ucuz planlardır ve bu iyi bir şeydir.
Bu, sinir bozucu bir zamanlayıcı planlarının, kaynakları boşaltmanız gerektiğinde ilk gidecek olan anlamına geleceği anlamına gelir.
Öyleyse şimdi soru şöyle:
“ Neden SQL Server gerektiğinde kullanılmayan planları kaldırmayı önemsiyorsa 'Neden Hoc İş Yükleri için Optimize Et' İHTİYACIM VAR? ” Buna
cevabım, eğer düzenli olarak s-ton dinamik olmayan sql üreten oodles parametresi olmayan reklamlarınız varsa -hoc sorgular, sonra bu özelliği açmak için mükemmel mantıklı.
Maksimum önbellek bellek alanını kullandıktan sonra önbellek planını / verilerin kaldırılmasını zorlayacak şekilde sistem kaynaklarının zorlanmasından kaçınmak istersiniz.
Bunu ne zaman açmam gerektiğini nasıl bilebilirim?
İşte size şu anda kaç tane Hoc Planını önbelleğe aldığınızı ve ne kadar disk alanı tükettiklerini göstermek için yazdığım bir sorgu (sonuçlar gün boyunca değişecek - bu nedenle yoğun bir yük sırasında test edin):
--Great query for making the argument to use "Optimize for Ad Hoc Workloads":
SELECT S.CacheType, S.Avg_Use, S.Avg_Multi_Use,
S.Total_Plan_3orMore_Use, S.Total_Plan_2_Use, S.Total_Plan_1_Use, S.Total_Plan,
CAST( (S.Total_Plan_1_Use * 1.0 / S.Total_Plan) as Decimal(18,2) )[Pct_Plan_1_Use],
S.Total_MB_1_Use, S.Total_MB,
CAST( (S.Total_MB_1_Use * 1.0 / S.Total_MB ) as Decimal(18,2) )[Pct_MB_1_Use]
FROM
(
SELECT CP.objtype[CacheType],
COUNT(*)[Total_Plan],
SUM(CASE WHEN CP.usecounts > 2 THEN 1 ELSE 0 END)[Total_Plan_3orMore_Use],
SUM(CASE WHEN CP.usecounts = 2 THEN 1 ELSE 0 END)[Total_Plan_2_Use],
SUM(CASE WHEN CP.usecounts = 1 THEN 1 ELSE 0 END)[Total_Plan_1_Use],
CAST((SUM(CP.size_in_bytes * 1.0) / 1024 / 1024) as Decimal(12,2) )[Total_MB],
CAST((SUM(CASE WHEN CP.usecounts = 1 THEN (CP.size_in_bytes * 1.0) ELSE 0 END)
/ 1024 / 1024) as Decimal(18,2) )[Total_MB_1_Use],
CAST(AVG(CP.usecounts * 1.0) as Decimal(12,2))[Avg_Use],
CAST(AVG(CASE WHEN CP.usecounts > 1 THEN (CP.usecounts * 1.0)
ELSE NULL END) as Decimal(12,2))[Avg_Multi_Use]
FROM sys.dm_exec_cached_plans as CP
GROUP BY CP.objtype
) AS S
ORDER BY S.CacheType
Sonuçlar:
Bunu açmak için " X MB’niz olduğunda " veya " Ad Hoc’unuzun% X’i Tek Kullanımlıksa " demeyeceğim .
Sprocs, Tetikleyiciler, Görünümler veya Parametrelenmiş / Hazırlanmış SQL'i etkilemez - yalnızca Geçici sorguları.
Benim kişisel tavsiyem, Prod Ortamınızda sadece açmak, ancak Dev Ortamınızda kapalı bırakmayı düşünmektir.
Bunu söylemek sadece bir dakika çalıştırmak için ya da daha fazla süren bir sorgu optimize eğer, o zaman o önbelleğe sahip ile gidecek kadar hızlı görebilirsiniz önce bunu 3 kez çalıştırmak istemiyorum, çünkü Dev için - her tek seferde en iyi optimizasyon tasarımını bulmak için düzenlersiniz.
İşiniz bütün gün bunu yapmayı gerektirmiyorsa, o zaman delirip DBA'dan her yerden açmasını isteyin.