Tempdb büyümesine neden olan SQL ifadeleri nasıl bulunur?


26

Bir sunucunun tempdb'si (SQL Server 2008) her ay birkaç kez 500 GB + 'ya çıkar. Hangi SQL ifadelerinin bu soruna neden olduğunu bulmak mümkün müdür? Sorun genellikle karmaşık birleşimlerden kaynaklanmaz create table #temp...; insert into #temp...ya da kaynaklanır select ... into #temp....

Başlangıç boyutu Tempdb dosyaların bazılarının da otomatik çok daha büyük değerlere her zaman ayarlanır. Nasıl önlenir?

Bazen önbelleğe alınmış planlar dosyaları yeniden boyutlandırmayı / küçültmeyi önler. Hangisinin tempdb'ye sahip olduğunu nasıl bulabilirim?


1
Üzgünüm neredeyse saat 2 oldu ve bu soruyu tamamen cevaplamak için gazım bitti, ancak diğer cevapları beklerken bu URL’ler kullanışlı olabilir - mssqltips.com/sqlservertip/1432/… ve google.com/search?q= Hangi + sorgular + + + tempdb kullanarak +
Aaron Bertrand

Yanıtlar:


27

Tempdb kullanımını izlemek için kullanabileceğiniz üç DMV vardır:

İlk ikisi, bir sorgu ve oturum düzeyinde tahsisleri izlemenize izin verecektir. Üçüncü sürüm, sürüm deposu, kullanıcı ve dahili nesneler arasındaki tahsisleri izler.

Aşağıdaki örnek sorgu, oturum başına size tahsisat verecektir:

SELECT
  sys.dm_exec_sessions.session_id AS [SESSION ID]
  ,DB_NAME(database_id) AS [DATABASE Name]
  ,HOST_NAME AS [System Name]
  ,program_name AS [Program Name]
  ,login_name AS [USER Name]
  ,status
  ,cpu_time AS [CPU TIME (in milisec)]
  ,total_scheduled_time AS [Total Scheduled TIME (in milisec)]
  ,total_elapsed_time AS    [Elapsed TIME (in milisec)]
  ,(memory_usage * 8)      AS [Memory USAGE (in KB)]
  ,(user_objects_alloc_page_count * 8) AS [SPACE Allocated FOR USER Objects (in KB)]
  ,(user_objects_dealloc_page_count * 8) AS [SPACE Deallocated FOR USER Objects (in KB)]
  ,(internal_objects_alloc_page_count * 8) AS [SPACE Allocated FOR Internal Objects (in KB)]
  ,(internal_objects_dealloc_page_count * 8) AS [SPACE Deallocated FOR Internal Objects (in KB)]
  ,CASE is_user_process
             WHEN 1      THEN 'user session'
             WHEN 0      THEN 'system session'
  END         AS [SESSION Type], row_count AS [ROW COUNT]
FROM 
  sys.dm_db_session_space_usage
INNER join
  sys.dm_exec_sessions
ON  sys.dm_db_session_space_usage.session_id = sys.dm_exec_sessions.session_id

Kullanımı belirli bir süre boyunca izlemek istiyorsanız , Kendra Little tarafından gösterildiği gibi sp_whoisactive ile veri toplamayı düşünün .


3
Teşekkürler. Seansın farkı [SPACE Allocated FOR USER Objects (in KB)]ve [SPACE Deallocated FOR USER Objects (in KB)]asıl işgal alanı mı?
u23432534

4

Bir problemin çeşitli kaynakları olabilir:

  • Tablo değişkenlerinin veya geçici tabloların kullanımı
  • sql sunucusu tempdb'de çalışma tabloları olarak ara sonuçlar yarattı - genellikle sıralama amaçları için (genellikle eksik indekslerin / eski istatistiklerin bir işaretidir)
  • sql sunucusu, tablo değerli işlevinin sonucunu önceden değerlendirmeye karar verdi ve bu durumda verileri tempdb'de saklar.
  • seçeneği olan dizinleri yeniden oluşturma SORT_IN_TEMPDB = ON
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.