MS SQL Server'daki bakire sorguların performansı nasıl artırılır?


10

Kendi bağımsız önbellekleme veri ASP.NET web sitesi var ve veri aynı sorgu ile ikinci kez sorgu gerekmez, bu nedenle uzun süre değişmez. Bu SQL Server'a gitmek ilk kez (bakire) sorguların performansını artırmak gerekiyor. Bazı sorgular SQL Server'ın kullanılmasına neden olabilecek kadar çok veri işler tempdb. SQL Server tempdbgerektiğinde kendi başına kullanmaya karar verir, bu yüzden geçici tablo değişkenleri veya geçici tabloları kullanmıyorum .

Benim db boyutum 16Gb, sunucu makinemde 32Gb fiziksel RAM var.

MS SQL Server önbelleğe alma stratejisinin, aynı verilerin yeniden yüklenmesini gerektiriyorsa benzer sorguların performansını hızlandırmak için verileri RAM'de tutmaya çalıştığını anlıyorum. Buna ek olarak, disk erişimine neden olmadan performansı hızlandırmak için tempdb yerine kullanılabilir RAM kullanmaya çalışacaktır.

Bir şey tempdb SQL Server saklamak için gereken sorgu geldiğinde ve yeterli RAM kullanılabilir olmadığını varsayalım, SQL Server 2 seçenek vardır:

1) önbelleğe alınmış bazı verileri kaldırmak ve disk yazmalarını önlemek için tempdb yerine yedeklenmiş RAM kullanmak

2) gelecekteki sorgular için önbelleğe alınmış verileri tutmak ve yazma yavaş diske neden tempdb kullanmaya başlayın.

Ben SQL Server bu durumda ne seçim yapacağımı bilmiyorum, ama ben sadece ilk kez (bakire) sorguların performansı umurumda çünkü seçim # 1 yapmak istiyorum, çünkü asla aynı sorguyu tekrar SQL Server göndermek için (Ben de benzer bir sorgu gönderebilirsiniz).

Bu senaryo için SQL Server önbellek stratejisi nedir?

Bakir sorgular için tempdb'den kaçınma ile ikinci kez sorguların hızı arasında RAM kullanımını nasıl dengeler?

SQL Server'ı # 1 seçimi yapacak şekilde yapılandırmak mümkün mü? Cevabınız evet ise nasıl?

Başka tüm virgin SQL sorgularının performansını nasıl artırabilirim?

SQL Server önbellekleme stratejisini bilmediğim için veritabanını RAM Disk üzerine yerleştirmek istiyorum. Bu, SQL Server her zaman 1 numaralı seçim yapsa bile, herhangi bir virgin sorgusunun önbelleğe alınmamış verilerin yüklenmesi için yüksek hıza sahip olmasını sağlayacaktır. Bunun riski, SQL Server'ın daha az kullanılabilir RAM ile daha fazla tempdb kullanmaya başlayabilmesidir (RAM Disk için 16Gb kullandıktan sonra sadece 16Gb kaldı), # 2 seçmeye devam ederse, dökülmelere neden olan bakire sorguları yavaşlatacaktır tempdb.

SQL 2008 R2 için çözümle ilgileniyorum, ancak muhtemelen SQL 2008, SQL 2005 için aynı olduğunu ve SQL 2000 olabileceğini düşünüyorum.

Açıklamalar:

Bu kutuda çalışan başka bir uygulama yok, SQL Server'a adanmış . Web sitesi ayrı bir kutu üzerinde çalışır.

Windows Server 2008 R2 Enterprise 64 bit üzerinde SQL Server 2008 R2 Standard Edition 64 bit.

Ben sadece salt okunur sorgular çalıştırın ve veritabanı salt okunur olarak ayarlanır .

Varsayalım ki zaten iyi endeksler var . Bu soru, SQL Server'ı seçim # 1'e karşı seçim # 2 yapmakla ilgilidir, kontrol etmenin bir yolu varsa ve RAM Disk bakire sorgular için doğru seçimi yapmasına yardımcı oluyorsa nasıl yapar.


Temp tabloları oluşturmasanız bile tempdb'nin kullanıldığını düşündüren nedir? Farklı mı yoksa tablolara göre gruplandırma mı kullanıyorsunuz?
darin boğazı

3
32/64 bit? Fiziksel mi sanal mı? Bu sunucu SQL Server'a adanmış mı yoksa aynı kutuda IIS veya diğer uygulamaları mı çalıştırıyorsunuz? Sorgu yürütme planının analizini yaptınız mı? Örnek sorgular ve / veya yürütme planları gönderebilir misiniz? Ve şans için bir tane daha ... Sorun sorgunuz çalışırken Kendra'nın sp_whoisactive günlüğünü kaydetme kılavuzunu izleyin ve çıktıyı gönderin.
Mark Storey-Smith

@darinstrait Büyük olasılıkla açıklama bir tür veya karma dökülme olacaktır.
Mark Storey-Smith

Yanıtlar:


7

Sorunuz temel olarak 'Sorgu belleği desteği nasıl çalışır?' Şeklinde yeniden ifade edilebilir. Konuyla ilgili iyi bir okuma, SQL sunucusu bellek desteğini anlama . Bir sorgu çalıştırılmadan önce , sıralamalar ve karmalar ve diğer bellek aç işlemleri için bir bellek yardımı gerekebilir . Bu hafıza yardımı bir tahmindir . Geçerli sistem durumuna (çalışan ve bekleyen istek sayısı, kullanılabilir bellek vb.) Dayanarak, sistem sorguyu gerekli miktara kadar bir bellek desteği verir . Bellek verildiğinde, sorgu yürütmeye başlar (hibe almadan önce korkunç 'kaynak semaforu kuyruğunda beklemesi gerekebilir). Yürütme sırasında bellek desteği garanti edilirsistem tarafından. Bu bellek miktarı veri sayfalarıyla paylaşılabilir (çünkü her zaman diske aktarabilirler), ancak asla diğer bellek kullanımlarıyla (örn. 'Çalma' konusu olamaz) paylaşılabilir. Veri sayfaları: Sorgu onun hibeden kararlı bellek için sormaya başlar Yani, motoru 'stratejisini # 1' dediğimiz dağıtacak olabilir tahliye edilmesi (kızardı kirli ise) sırayla sorgu o sözü verildi bellek vermek. Şimdi tahmin doğruysa ve hibe istenen belleğin% 100'ü ise, sorgu 'dökülmemelidir'. Ancak tahmin yanlışsa (kardinalite tahminlerine dayanır, bu nedenle eski istatistiklere tabidir) veya sorgu istediği tüm hibeyi alamadıysa, sorgu 'dökülecektir'. Bu tempdb resim ve performans genellikle tanklar haline geldiğinde.

Bu süreçte bir şeyi kontrol eden elinizde bulunan tek düğme Kaynak Yöneticisidir . RG, bir havuz için bir MIN ayarı belirtmek için kullanılabileceğinden, belirli bir iş yükü için bellek ayırmak için kullanılabilir, böylece istediği bellek miktarını alır . Eğer uygun soruşturma yaptıktan sonra Tabii ki, azaltılmış bellek hibe gösterileri o vardır suçlu ve tabii ki üzerindeki etkisi sonrasında diğer iş yükleri değerlendirilmiştir. Ve elbette test edildi.

Şimdi orijinal sorunuza geri dönelim. Araştırmanız doğruysa (eğer çok büyükse) iki soruna dikkat çekmek isterim:

  • bir web sitesi için bellek desteği gerektiren üretim sorgularında çalışırsınız . Bu büyük bir hayır-hayır. Bellek hibeleri, HTTP isteklerini sunmakta yeri olmayan analitik sorguların göstergesidir.
  • sorgularınız muhtemelen istedikleri bellek hibesini almak için olay değildir. Yine, web siteleri gibi gecikme kritik iş yükü için daha da hayır.

Bu bana söyleyen şey, temel bir tasarım ve mimari probleminiz olması. Web siteleri gecikme güdümlüdür ve iş yükü gibi OLTP oluşturmalı, bellek verilmez ve sorgularda bellek baskısı olmamalıdır. Dökülmelerden bahsetmiyorum bile. Analitik sorgular çevrimdışı işlerde çalıştırılmalı ve HTTP istekleri istendiğinde hızlı kullanılabilirlik için önceden işlenmiş sonuçları saklamalıdır.


@ Mark: Çoğu sorgu bellek desteği gerektirmez. Sadece birkaç operatör (en önemlisi sıralama ve karma birleştirme) bir çalışma arabelleğine ihtiyaç duyar ve böylelikle bir hibe talep eder. Bu standart 'isimlendirme'. Her bir sorgunun bir tane gerektirdiği ve biraz bellek içerdiği yürütme ortamını ve sorgu yürütme planını düşünüyor olabilirsiniz . Bir bellek desteği çok daha büyüktür (MB). İkincisi, şuna bakın sys.dm_exec_query_memory_grants: requested(max), required(min) ve granted(fiili).
Remus Rusanu

Özür. Ben yanlış başına aynı bellek memuru tahsis başına sorgu başına minimum olduğunu bir yerden almıştı.
Mark Storey-Smith

İki mermi noktanıza katıldığımdan hala emin değilim. Her türlü önemsiz tür ve karma birleştirme işlemleri asgari düzeyde hibe gerektirir, bu yüzden bunların tamamen ortadan kaldırılması gerektiğini söylemek aşırı görünür. Yetersiz bağışlardan tempdb'ye yapılan dökülmelerin kırmızı bir bayrak olması kesinlikle mantıklıdır, ancak hibe gerektiren herhangi bir operasyonda battaniye yasağı birçok insanı gereksiz bir önleyici optimizasyon yoluna götürebilir mi?
Mark Storey-Smith

OP gerekli tüm endekslere sahip olduğunu iddia ediyor. Bu doğruysa ve iş yükü, farkedilebilir olmak için yeterli bellek hibe (ve hatta dökülme) sorunlarına sahipse, iş yükünün bir web sitesi için çok analitik olduğunu söyleyebilirim . Sonuçta performans optimizasyonu her zaman temel nedeni belirlemek için bir araştırma oyunudur . Tüm battaniye ifadeleri ve yasakları her zaman yanlış olduğunu kanıtlayan bir karşı örnek bulur, yani verilir. OP'nin çok analitik bir iş yükü oluşturan bir tasarım sorunu var mı? Bilmiyorum. Bence öyle mi? % 87,5 güven diyebilirim.
Remus Rusanu

@Remus: Tahmininiz iyiydi, web sitesi sorgularım% 100 analitik. Kullanıcıların SQL Server'a (tabii ki indekslemeyi zorlaştırır) herhangi bir olası filtre, agrega ve gruplama kombinasyonunu göndermek için kullanıcı arayüzündeki olası sorguları oluşturmalarına olanak tanır. Evet, daha sonra almak için sonuçları zaman uyumsuz modda kaydetmelerini sağlayabilirim, ancak amaç 2-10 saniye sonra sonuç hemen elde edilebilecek herhangi bir sorguyu o kadar hızlı çalıştıracak ve ayrıca analitik sorgulama da bu web sitesinin tek işlevidir. , Async yapmak sadece analitik olmayan başka sorgular varsa mantıklı olduğunu düşünüyorum.
alpav

3

Bahsetmediğiniz şey, veritabanında ne tür sorguların çalıştırıldığı ve sorgularınızın performansını hızlandırmak için doğru dizinler olup olmadığıdır.

Aynı kutuda çalışan başka uygulamaların olup olmadığından da emin olmanız gerekir. Kutunun 32 GB RAM'i olmasına rağmen, herhangi bir yapay sınır koymak için veritabanı sunucusunda herhangi bir maksimum bellek ayarı ayarladınız mı? Aynı sunucuda çalışan uygulamalar varsa, SQL ve diğer uygulamalar kaynaklar için rekabet ediyor olabilir ve SQL'in belleğe çok aç olduğunu unutmayın.

SQL Server, dahili sıralama veya karma birleştirme / toplama veya biriktirme işleçleri vb için tempdb kullanır ve bu davranışı denetleyemezsiniz. Yapabileceğiniz şey, geri döndürülen veri miktarını sınırlamaktır.

Bu kutudaki bekleme istatistiklerini kontrol ettiniz mi? SQL Server bir kaynakta her beklediğinde, SQL Server bekleme kaynağını izler ve bu bilgilere bakmak yardımcı olur.

Glenn Berry teşhis sorgularına bakın ve bu sizin için iyi bir başlangıç ​​olacaktır.

Ayrıca http://weblogs.sqlteam.com/dang/archive/2009/06/27/Forced-Parameterization-A-Turbo-Button.aspx adresinde belirtildiği gibi PARAMETERİZASYON FORCEDuna da bakın.


tamam, zaten doğru dizinler olduğunu varsayalım. Bunun salt okunur sorguları olan salt okunur veritabanı olduğunu ve SQl Server kutusunda çalışan başka bir uygulama olmadığını belirtmeyi unuttum.
alpav

İstatistikleriniz güncel mi? Salt Okunur veritabanları eksik veya güncel değilse istatistik oluşturamaz. Verileriniz eğri veya anahtar için benzersiz değerlere sahip mi? Bu davranışa neden olabilecek birçok faktör vardır.
Sankar Reddy

"Bu davranış" ile ne demek istiyorsun? Bir şeylerin yanlış gittiğinden bahsetmedim. Sadece özel koşullar altında performansı artırmak istiyorum. SQL Server her durumda çalışacak şekilde optimize edilmiştir, ancak durumumda en iyi şekilde çalışabilir veya çalışmayabilir. Dengeli seçim # 1 vs # 2 yapmak için SQL Server'a güvenebilir miyim emin değilim. Her yeni veri eklediğimde sp_updatestats çalıştırıyorum.
alpav


2
Sp_updatestats çalıştırdığınızda, seçtiğiniz örnek oran nedir? Varsayılan oran çok örnektir ve dizinin boyutuna bağlıdır. Sorgularınız çoğunlukla (yalnızca) yeni verileri sorgularsa ve sp_updatestats yapsanız bile, SQL Server yürütme planlarında tanrı kararları veremez.
Sankar Reddy

2

Bu soru şu anda bir sorun arayan bir çözüm gibi okuyor. Bir RAM diskinin çözüm olduğuna karar verdiniz ve birisinin bu seçimi doğrulamasını istiyorsunuz. Üzgünüm, olmayacak.

Tempdb'ye bir dökülmeyi ölçtüyseniz ve gözlemlediyseniz, bunun nedeni neredeyse bir sıralama veya karma işlem ve yetersiz bir sorgu belleği desteği olacaktır. İşlenecek verilerin hacmine bağlı olarak bu kaçınılmaz olabilir, ancak kaçınılması için sorgu ve / veya indeksleme iyileştirilebilir.

SQL Server'ın belleği ve SQL Server Bellek Yönetimini nasıl yönettiğini daha iyi anlamak için Tampon Yönetimi'ne göz atın ve belleğinizin nerede tahsis edildiğini anlamak için bazı temel araçlar ve DMV sorguları için açıklandı.

Başka tüm virgin SQL sorgularının performansını nasıl artırabilirim?

Bu büyük bir konu. Sorguyu yayınlayın ve planlayın, hedefli geri bildirim alacaksınız.

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.