Bir dizini SQL Server 2008 ile bellekte kalmaya zorlamanın bir yolu var mı?


10

Zaman zaman bazı sorguları çalıştırmam gereken birkaç milyon satır içeren bir tablo var. İlk sorgu genellikle oldukça yavaş olacaktır (yaklaşık 10 saniye) ve sonraki sorgular genellikle çok daha hızlıdır (yaklaşık 1 saniye). Birkaç saat sonra yavaş / sonra hızlı bir döngü tekrar başlar.

İcra planımda tüm gerekli indeksin mevcut ve uygun şekilde kullanıldığını kontrol ettim ve performans farkının, endeksin aslında sonraki sorgular için bellekte olmasından kaynaklandığını varsayıyorum (haklı mıyım, yoksa başka var mı?) olası nedenler?)

Ben de dizinleri kullanarak diğer sorguların bir sürü çalışıyorum, ancak bu sorguları daha az zaman alıcı ve performans daha az kritik, bu yüzden bu dizinler aslında benim kritik dizin bellek önbellek dışına iterek endişe ediyorum.

Açıkça 'daha fazla RAM ekle' düzeltmesinin yanı sıra, dizini belleğe geri zorlamak için her saat çalıştırmak için kukla sorgular oluşturmayı düşünüyorum.

Bunu yapmanın daha zarif bir yolu var mı? SQLServer'ı tek bir dizinin önbelleğe alınmasına yetecek kadar belleğe sahipse, bunun olması gerektiğini ima etmenin bir yolu gibi?

Ben genellikle en iyi şey bu tür şeyler ile ilgili SQLServer berbat değil, ama benim sorgu alışılmadık doğası (çok nadir çalışır, ancak zaman kritik) bana mantıklı (mümkünse) inanıyor yapar biliyorum .

Belirli bir zamanda hangi dizinlerin bellekte önbelleğe alındığını bilmenin bir yolu olup olmadığını da merak ediyorum.

Yanıtlar:


13

Eskiden bir DBCC PINTABLEkomut vardı ama 6.5 ya da 7.0'da çalışmayı bıraktığına inanıyorum. İfade muhtemelen denerseniz işe yaradığını önerecektir , ancak sadece geri dönüyor, gerçekten bir hayır-op.

Ne yazık ki, hangi dizinlerin önbellekte tutulduğunu kontrol etmenin herhangi bir yolu yoktur - periyodik olarak sıcak olan tablolar için bildiğim en iyi çözüm, bunları manuel olarak sıcak tutmaktır (zaten sorunuzda açıkladığınız).

Hangi dizinler için bellekte olduğu hakkında kaba bir fikir edinebilirsiniz sys.sm_os_buffer_descriptors. Bununla ilgili bir ipucu yayınladım:

http://www.mssqltips.com/sqlservertip/2393/determine-sql-server-memory-use-by-database-and-object/


Hmm, bu senaryoya göre, 75 MB'lık bir tablo 900 MB'lık tampon havuz kaplıyor. Bu normal mi / mümkün mü?
db2

1
@ db2 kaç tane dizininiz var?
JNK

2
Ayrıca ne kadar parçalanmış ... veriyi değil sayfaları ölçüyor. Sayfalarınız nispeten boş olabilir ve bu, şişirilmiş bir ölçüme katkıda bulunabilir.
Aaron Bertrand

0

İpuçlarını kullanmayı KEEPPLANve KEEPPLAN FIXED sorgulamayı deneyin .

KEEPPLAN, sorgu optimize ediciyi bir sorgu için tahmini yeniden derleme eşiğini gevşetmeye zorlar.

KUTULU PLAN, sorgu iyileştiricisini istatistiklerdeki değişiklikler nedeniyle bir sorguyu yeniden derlememeye zorlar. KEEPFIXED PLAN belirtilmesi, yalnızca temel tabloların şeması değiştirildiğinde veya bu tablolara karşı sp_recompile yürütüldüğünde bir sorgunun yeniden derlenmesini sağlar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.