Bir masanın önbelleğini tutmak için ne kadar hafızaya ihtiyaç vardır?(SQL Server 2008)


5

8GB, 40M satırlık, çoğunlukla büyük bir tablo kullanan uzun ve karmaşık sorgular kullanıyorum.AFAIK, tüm/çoğu satır her sorguda kullanılır.Etkinlik izleyicide çok fazla G/Ç görüyorum - ilk sorgu için ve sonraki her biri için.Sunucu şu anda 6,5GB hafıza kullanıyor ve yükseltmek istiyorum.Soru şu, tüm bu disklerin okunmasını önlemek için ne kadar bellek gerekli?Masanın büyüklüğünde veya daha fazlası olan oyun parkında mı?

Bu, SET STATISTICS IO çıktısıdır.Benim sorduğum BigTable, SmallTable'ın BigTable ile 1 - çok ilişkisi var.#entrance, sorgunun çıktısını tutar (birkaç yüz çıktı satırı).

Table 'SmallTable'. Scan count 249005, logical reads 2829948, physical reads 2605, read-ahead reads 10395, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'BigTable'. Scan count 194004, logical reads 13482115, physical reads 33841, read-ahead reads 1181136, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table '#entrance__000000000023'. Scan count 0, logical reads 1568, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
+2

Bu sunucu/veritabanı, sorgularınızı 8GB'lık veri tablosundan daha fazlasını yapmaktan başka bir şey yapmıyor mu?Ayrıca kafamı 1 masanın üzerine biraz çiziyorum ama bu sorunun karmaşık bir sorgusu.Herhangi bir DDL şansı veya bu karmaşıklığın doğası hakkında küçük bir içgörü var mı? 14 eyl. 112011-09-14 22:20:40

  0

Sadece basit bir kontrol, hangi SQL server sürümünü kullanıyorsunuz?Eğer kurumsal değilse, o zaman mevcut hafızanızın tümünü sql server için kullanamazsınız. 16 eyl. 112011-09-16 15:30:00

  0

Sonunda sunucunun RAM'ini yükselttim ve bir test yaptım.Sonuçları aşağıda bir cevap olarak yayınladım. 09 şub. 132013-02-09 08:50:11

3

Sorgularınızın niteliği nedir?Sadece SEÇİMLER?Veya bir DUI karışımı (SİLME, GÜNCELLEME, INSERT'ler)?ve kurtarma modeliniz nedir?varsayılan işlem yalıtım düzeyini kullanıyor musunuz?

Tüm bu sayfaları hafızaya almak istiyorsanız, daha fazla hafıza almanız gerekecektir (ama bunu zaten biliyordunuz).'Ne kadar' olduğunu bilmek istiyorsunuz, ancak gerçek şu ki, sorgularınızın niteliğine bağlı olarak tüm tabloyu tutacak kadar hafızaya sahip bazı G/Ç sorunlarını görebiliyorsunuz.

Yukarıdakilerin hepsini göz önünde bulundurarak ... evet, diskteki masanın büyüklüğünü bellek miktarı olarak toplayın.Sonradan hala disk G/Ç’iniz olduğunu görürseniz şaşırmayın.

  0

Sunucu RAM'ini yükselttim ve “diskteki masanın büyüklüğünü bellek miktarı gibi ballpark” kesinlikle doğru.Aşağıdaki cevaba bakınız. 08 şub. 132013-02-08 11:59:48


8

Bu iki bölümden oluşan bir cevap.

İlk kısım, alabileceğiniz kadar RAM satın almanız (sunucuya sığacağı sürece).

İkinci bölüm, daima verileri okurken görmenizdir.İşin püf noktası bu okumaların fiziksel mi mantıklı mı olduğunu görmek.Fiziksel okumalar diske doğru gidiyor.Mantıksal okumalar bellekteki tampon havuzundan okunur.Bunu, SQL Script'in üzerine "SET STATISTICS IO ON" yazıp ardından SSMS'de çalıştırarak görebilirsiniz.Mesajlar sekmesinde, çalışmakta olan her sorgu için özel G/Ç bilgileri, özellikle de masa bazında gerçekleşen hem mantıksal hem de fiziksel işlemlerin (sizin durumunuzda okur) sayısını alırsınız.Fiziksel okuma sayıları oldukça yüksekse (bu sayılar temelde 8'e kadar çoklu okunan blokların sayısıdır, daha sonra Megs cinsinden bir sayı elde etmek için 1024'e bölün) ve sonra daha fazla RAM'e ihtiyacınız vardır.Mantıksal okuma sayıları yüksekse, aslında diske gitmezsiniz ancak sorgunuzun ayarlanması, indeksler yaratılması vs.

(Not: Bu cevabın amaçları doğrultusunda, yalnızca SELECT ifadeleri olduğunu farz ediyorum. INSERT/UPDATE/DELETE işlemleri biraz daha karmaşık, ancak aynı temel bilgiler geçerli.)

  0

Ben deneyeceğim: SET İSTATİSTİK IO AÇIK ve geri rapor.Daha fazla bilgi: Sorgular% 100 seçimdir.Her sorgu birkaç dakika sürer.Sunucu, sorgulama yapan ve sonuçları Excel'e döken küçük bir uygulamayı da çalıştırıyor, ancak bunun sunucu performansını etkilediğinden şüpheliyim. 15 eyl. 112011-09-15 05:00:37

  0

Çıktıyı okumak için yardıma ihtiyacınız olursa, yürütme planını ve SET STATISTICS IO çıktısını göndermek için çekinmeyin. 15 eyl. 112011-09-15 05:05:59


1

Daha fazla RAM'in bu konuda yardımcı olacağından emin değilim.Hızlı hesaplama, sorgunuzun 125GB veri bölgesinde bir yerde işlendiğini ve 8 GB içeren bir tablo için oldukça etkileyici olduğunu gösteriyor.

(2829948 + 13482115 + 1568) x 8/1048576 = 125 GB

270 MB'lık fiziksel okuma yavaş çalışmanın bir kısmını açıklar, ancak bellek içi ek yükler kadar bir şey ifade etmez.

Sorguyu yeniden çalışmaktan, ek bellek eklemek yerine daha iyi sonuçlar alacaksınız.DDL/query/execution planını yeni bir soru sorduktan sonra birileri kesinlikle yardımcı olabilir.


3

Partiye her zaman geç kalırım.:) Bu sorgu büyük olasılıkla büyük etkiye ayarlanabilir.Ancak, 8 GB'lik bir tabloyu ne kadar RAM önbelleğe alacağı sorusu için ... bir ön soru SQL Server'ın sunucu için kaç tane bellek düğümü rapor ettiği?Her bellek düğümü (fiziksel NUMA düğümlerine mantıksal eşdeğeri) bağımsız olarak yönetilen bir arabellek havuzu önbelleğine sahiptir.Bu düğümdeki işlemciler üzerinde çalışan görevler, o düğümdeki arabellek havuzuna bloklar ekler.

Bu nedenle, 8 GB'lık tabloyu bütünüyle okuyacak görevlerin tek bir NUMA düğümünde çalıştırılması ihtimali varsa, o düğümün arabellek havuzu 8 GB'lık tabloyu içerebilmelidir.NUMA düğümü başına 8 GB maksimum sunucu belleği ile başlayın.O zaman arttırmaya başlayalım.Sorgu belleği, tampon havuzunun% 70'ine kadarını tüketebilir ve veritabanı bloğu içeriği için yalnızca% 30'unu bırakabilir.Bu nedenle, 8 GB'lik tablonun, sunucu için tek bir NUMA düğümündeki maksimum sunucu belleğinin% 30'undan daha fazla olmaması gerekir.Maksimum sunucu belleği için 26 2/3 GB.NUMA düğümü başına.SQL Server 2012, SQL Server 2008 R2 ve önceki sürümlerinin çok sayfalı ayırıcıyı kullandığı şeyler (bu nedenle maksimum sunucu belleği kapsamı dışındaydı) şimdi maksimum sunucu belleği kapsamı dahilinde ve hesaba katılması gerekiyor.SQL Server max sunucu belleği sınırının bir parçası olsun veya olmasın, toplam sunucu belleğine her iki şekilde de dahil edilmesi gerekir.

Ah evet ... geçici tabloların herhangi bir kullanımı veya diğer tempdb kullanımları, tablonun önbellekten tahliye edilmesine izin vermemek için maksimum sunucu hafızasına da yerleştirilmelidir.

Windows işletim sistemi için yeterli bellek ekleyin (en az 4 GB).SQL Server çalışan iş parçacığı, SQL Server çekirdek işlemi, SQL Agent işleri, diğer uygulama belleği ihtiyaçları için yeterli ekleyin.

Tek bir NUMA düğümü sunucusunda 8 GB'lık tabloyu güvenilir bir şekilde önbelleğe almak için maksimum sunucu belleği olan en fazla 27 GB RAM ile 36 GB RAM toplarım.Birden fazla NUMA düğümü varsa, NUMA düğümü başına en az 26 2/3 GB maksimum sunucu belleği ve ek NUMA düğümlerinde ek çekirdeklere eşlik eden ek çalışan iş parçacıkları artacaktır.

Bu aşırı gibi görünse de, bunun nedeni kısmen SQL Server'ın NUMA'yı nasıl kullandığıdır.Ama şansın altında olabilir!Tek bir tembel yazar yeterli olacaksa, NUMA'yı yoksaymak ve tek bir arabellek havuzunu yönetmek için başlangıç ​​izleme bayrağını 8015 kullanabilirsiniz.Bu şekilde, sunucuda kaç NUMA düğümü olursa olsun, yaklaşık 36 - 40 GB 8 GB'lik masanın bellekte saklanması için yeterli olmalıdır.Bunu aşağıdaki blog yazısında biraz daha tartışalım.İzleme bayrağı 8015'i kullanmaya karar verirseniz, yükselen spinlock çekişmesi ve CMEMTHREAD bellek tahsisi ile ilgili beklemeleri önlemek için bununla birlikte izleme bayrağı 8048'i birlikte değerlendirmenizi öneririm.http://sqlsasquatch.blogspot.com/2013/02/sql-server-cache-database-working-set.html


2

Sunucu RAM'ini 8GB'tan 64GB'a yükselttim ve bir test yaptım.Tablo boyutu şimdi 16.05 GB ve dizin alanı 187 MB'dir (1 kümelenmiş ve 1 benzersiz kümelenmemiş dizin).Tablodaki 137 alanın her birinin ortalaması olan bir sorgu çalıştırmadan önce ve sonra toplam sunucu RAM kullanımını kontrol ettim.Toplam bellek 4,22 GB'dan 20,4 GB'a yükseldi = 16,18 GB, bu da masanın boyutunun% 100,8'i.SQLRockstar, RAM kullanım miktarının tablonun büyüklüğünde bir oyun alanı olduğunu tahmin etmekte kesinlikle haklıydı.

Daha fazla bilgi:

  • Kümelenmiş dizinin sayfa doluluk oranı% 98,1
  • Tablodaki daha fazla sorgu, disk IO'suna neden olmamıştır.
  • SQL Server 2008R2 Geliştirici
  • Yürütme planı, kümelenmiş dizinin kullanıldığını göstermektedir