SQL Server - bellekte DB zorla?


14

SQL Server 2005 64 bit çalıştıran bir Windows 2008 x64 sunucumuz (4 x 4 çekirdekli CPU, 32GB RAM) var. Sayfalar bellekte önbelleğe alınana kadar erişilmesi biraz yavaş olan küçük (6GB) ancak çok önemli bir veritabanımız var (kullanım çok rastgele I / O, bu nedenle belirli bir sayfa bellekte ve son kullanıcılar çok düşük ilk yavaşlıktan şikayetçi). Diskler yeterince hızlı (yerel 15K SAS) ama uygulama biraz beceriksizce yazılmıştır (bir COTS çözümü), bu yüzden SQL Server 2005'te (2008 desteklenmiyor) bir veritabanını "zorlamak" için bir yol olup olmadığını merak ediyorum ilk önbellek doldurma mavilerinden kaçınmaya yardımcı olmak için henüz yükseltmemeliyiz).

Şu anki yöntemim, veri sayfalarını bellekte almak için bir komut dosyasındaki her tablodan bir SELECT * çalıştırmam, ancak bazı nesnelerin (dizinler, Tam metin araması vb.) Bu yöntemle önbelleğe alınmaması (ve komut dosyalarını dizinleri sorgulamak için değiştirmemesi ve önbelleğe uygun WHERE yan tümcelerini yazın, okyanus kaynatma kompleksidir).

Yanıtlar:


15

Hayır, maalesef bir veritabanını önbelleğe zorlamanın bir yolu yok. Kaba kuvvet yönteminiz muhtemelen en basit yöntemdir. Çok düşük eşik ayarına sahip dizin birleştirme komut dosyalarını kullanarak, örneğin% 1 parçalanmışsa dizini yeniden oluştur demek gibi yaklaşabilirsiniz:

http://sqlserverpedia.com/wiki/Index_Maintenance

Daha uzun sürer ve diske daha fazla yazma işlemi içerir, ancak dizinlerinizi birleştirmenin ve istatistikleri güncellemenin yan etkisi olacaktır, bu zaten iyi bir fikirdir.


9

Tamam - Brent'in cevabı hakkında yorum yapamam (henüz yeterli temsilcim olmadığı için) - ancak dolandırmak yoluna gidecekseniz, dizini mutlaka yeniden oluşturmayın - yeni dizinler oluşturacağından, yeterli boş alan yoksa veritabanını büyütme ve bir sonraki günlük yedeklemenizin en azından dizinlerinizin boyutu olduğunu ve günlüğünüzün de bir ton günlük kaydı olabileceğini garanti etme (kurtarma modeline bağlı olarak). Birleştirme rotasını yapacaksanız, boş alan gerektirmeyen (iyi, bir 8k sayfa) bir ALTER INDEX ... REORGANIZE yapın, ancak yaprak seviyesini belleğe okuyacak ve sadece parçalanmış olarak çalışacak sayfaları. Yaprak olmayan seviyeler bazı sorgulardan sonra hızlı bir şekilde girmeli ve (hava çıkışına bağlı olarak) yaprak seviyesinden çok daha az veri olmalıdır.


Seviyorum
Matt Rogish

1

Veritabanı nesneleri neden önbellekten temizlenir? SQL hizmetlerini yeniden mi başlatıyorsunuz veya veritabanını çevrimiçi mi alıyorsunuz? Yoksa diğer veritabanlarından önbelleklenerek mi itiliyorlar?

Saygılarımızla,

SCM.


1
Şu anda sistem test ediyor ve sık sık yeniden başlatılıyor; kullanıcılar bundan sonra şikayet ederler. Üretimde umarım çok daha az
Matt Rogish

Daha çok bağlantı başlatma gecikmeleri gibi geliyor; Kullanıcıların önbelleğe alınmış / önbelleğe alınmamış okumalarda belirgin bir fark görmesini beklemem aşırı yüklenmiş veya yavaş diskler gibi başka faktörler yoksa.
SqlACID


1

Anahtar tablolarda FULLSCAN ile istatistik güncelleme bazı senaryolar yaşadım önbelleğe veri zorladı ve bu tablolar etrafında benim sonraki DML çok daha hızlı yaptı. Ve bu, uygulama planlarında hiçbir değişiklik yapılmadığı için eski istatistiklerin bir sonucu değildi.


0

Neden yalnızca bu veritabanıyla ikinci bir SQL Server örneği yüklemiyor ve bu örnek için minimum belleği 6 GB olarak ayarlamıyorsunuz ?

Bu, diğer veritabanlarınızın hiçbir zaman "küçük ama çok önemli" veritabanınızdan bellek ayırmayacağını garanti eder.

Ayrıca, diğer örneği çevrimdışı duruma getirebileceğiniz ve küçük DB'nizin bellekte kalacağı anlamına gelir.


0

Ben senin sql kontrol etmek için profiler kullanırdım. 'Mantıksal' okumaları 'fiziksel' okumalarla karşılaştırın. SQL sunucusu akıllıdır ve en verimli sonuçlar için gereken RAM'i kullanır.

Ayrıca otomatik verilerinizin güncel olup olmadığını kontrol edin.

Sorgu türü ve db tablo boyutları hakkında daha fazla fikir olmadan biraz garip geliyor.

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.