MSSQL Server’da Memory Grant Query Hints

SQL Server bir sorguyu çalıştırmadan önce, özellikle SORT ve HASH JOIN gibi işlemler için ne kadar belleğe ihtiyaç duyacağını tahmin eder. Bu tahmine Memory Grant denir. Ancak istatistiklerin güncel olmaması veya karmaşık sorgu planları nedeniyle SQL Server bazen gereğinden çok (“Excessive Grant”) veya gereğinden az (“Low Memory Grant”) belik ayırır.

SQL Server 2012 (SP3) ve 2016 sonrasında hayatımıza giren MIN_GRANT_PERCENT ve MAX_GRANT_PERCENT hintleri, bu süreci manuel olarak dizginlememize olanak tanır.

Sorgu düzeyinde kullanabileceğimiz iki ana parametre vardır:

  • MIN_GRANT_PERCENT: Sorguya, tahmin edilenin ötesinde, konfigüre edilmiş limitin belli bir yüzdesi kadar bellek garanti eder. Sorgunun “Spill to TempDB” (diske yazma) yapmasını engellemek için kullanılır.
  • MAX_GRANT_PERCENT: Sorgunun toplam bellek limitinin belirli bir yüzdesinden fazlasını kullanmasını engeller. “Memory Clerk” üzerinde aşırı baskı kuran, sistemi kilitleyen sorguları kısıtlamak için idealdir.

Büyük bir tabloyu sıralayan ancak sistemdeki diğer işlemleri durma noktasına getiren bir rapor sorgunuz olduğunu düşünelim. Bu sorgunun toplam hafızanın en fazla %10’unu kullanmasını istiyoruz:

SELECT CustomerID, OrderDate, TotalAmount
FROM Sales.BigOrders
ORDER BY TotalAmount DESC
OPTION (MAX_GRANT_PERCENT = 10);

Küçük bir bellek tahmini alıp diske (TempDB) yazdığı için yavaşlayan bir sorguya, en az %5 bellek garantisi verelim:

SELECT ProductID, SUM(SalesAmount)
FROM Sales.DetailedSales
GROUP BY ProductID
OPTION (MIN_GRANT_PERCENT = 5);

 Özellik  Avantajları  Dezavantajları

  • Performans  TempDB spill işlemlerini azaltarak sorguyu hızlandırır.  Yanlış değer seçilirse RESOURCE_SEMAPHORE beklemelerine (sorgu kuyruklarına) neden olur.
  • Stabilite  Bir sorgunun tüm sunucu kaynağını tüketmesini (Memory Grabbing) engeller.  İstatistikler güncellense bile hint statik kalır; zamanla verimsizleşebilir.
  • Esneklik  Resource Governor kullanmadan sorgu bazlı limit koyma imkanı tanır.  Kodun içine gömüldüğü için yönetimi zordur (Plan Guide gerekebilir).

Bu hintleri kullanmadan önce şu soruları sormalısınız:

  •   İstatistikler güncel mi? Çoğu bellek sorunu UPDATE STATISTICS ile çözülür.
  •   Eksik indeks var mı? SORT işlemini ortadan kaldıran bir indeks, bellek ihtiyacını sıfırlayabilir.
  •   Parametre Kokusu (Parameter Sniffing) var mı? Farklı parametreler için farklı bellek ihtiyaçları doğuyor olabilir.

Not: MAX_GRANT_PERCENT = 0 gibi uç değerler sorgunun çalışmamasına neden olabilir. Her zaman küçük testlerle başlayın.

Memory Grant hintleri, bir cerrahın neşteri gibidir; doğru yerde hayat kurtarır, yanlış yerde ciddi yaralar açar. Eğer sisteminizde sürekli RESOURCE_SEMAPHORE beklemesi görüyorsanız veya bazı sorgularınızın devasa bellekler rezerve edip aslında kullanmadığını fark ederseniz, bu hintler en iyi dostunuz olacaktır.

Başka makalede görüşmek dileğiyle..

Emanetlerinizi ve sözlerinizi tutun. Müminun-8

Author: Yunus YÜCEL

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir