Hangi oturumun hangi geçici tabloyu tuttuğunu bulma


14

Geçici veritabanı dolduğu bir SQL Server 2005 veritabanına sahibiz. SQL Server Management Studio'ya girerek tüm geçici tabloları tempdb'de görebiliyorum. Hangi oturumun hangi geçici tabloyu tuttuğunu söylemek mümkün müdür? İdeal olarak her oturum tarafından kullanılan geçici tabloları listeleyecek bir sorgu.

Teşekkürler,


1
Temp veritabanındaki alanı kullanan belirli kullanıcıyı takip etmek istiyoruz. Şu anki görevlerin ilgilendiğimiz tempdb tüketimi.
SQLMIKE

Yanıtlar:


16

2007'de Connect'te bir şeylerin inşa edilmesini istedim. Bu, 2008 sürümü için reddedildi ve daha sonra Connect birkaç yıl önce ölene kadar göz ardı edildi. SQL Server için yeni geribildirim sitesinde bulmaya çalıştım , ancak bu arama mutlak çöplük ateşi. İsteğimin başlığı "geçici tabloyu session_id ile eşleştirmek için dmv" idi - arama yalnızca VEYA yapabildiğinden "harita geçici tablosu" 118 sayfa sonuç döndürür. Google, Connect'i öldürdüklerinde öğenin kesilmediğini öne sürüyor .

Bu arada, SQL Server 2005 ve 2008 için bu bilgileri varsayılan izlemeden alabilmelisiniz:

DECLARE @FileName VARCHAR(MAX)  

SELECT @FileName = SUBSTRING(path, 0,
   LEN(path)-CHARINDEX('\', REVERSE(path))+1) + '\Log.trc'  
FROM sys.traces   
WHERE is_default = 1;  

SELECT   
     o.name,   
     o.OBJECT_ID,  
     o.create_date, 
     gt.NTUserName,  
     gt.HostName,  
     gt.SPID,  
     gt.DatabaseName,  
     gt.TEXTData 
FROM sys.fn_trace_gettable( @FileName, DEFAULT ) AS gt  
JOIN tempdb.sys.objects AS o   
     ON gt.ObjectID = o.OBJECT_ID  
WHERE gt.DatabaseID = 2 
  AND gt.EventClass = 46 -- (Object:Created Event from sys.trace_events)  
  AND o.create_date >= DATEADD(ms, -100, gt.StartTime)   
  AND o.create_date <= DATEADD(ms, 100, gt.StartTime)

Utanmadan bu Jonathan Kehayias blog yazısından kaldırıldı .

Alan kullanımını belirlemek için, aşağıdakiler gibi görünümlerden verilere katılmak üzere bunu daha da geliştirebilirsiniz sys.db_db_partition_stats- örneğin:

DECLARE @FileName VARCHAR(MAX)  

SELECT @FileName = SUBSTRING(path, 0,
   LEN(path)-CHARINDEX('\', REVERSE(path))+1) + '\Log.trc'  
FROM sys.traces   
WHERE is_default = 1;  

SELECT   
     o.name,   
     o.OBJECT_ID,  
     o.create_date, 
     gt.NTUserName,  
     gt.HostName,  
     gt.SPID,  
     gt.DatabaseName,  
     gt.TEXTData,
     row_count = x.rc,
     used_page_count = x.upc
FROM sys.fn_trace_gettable( @FileName, DEFAULT ) AS gt  
JOIN tempdb.sys.objects AS o   
     ON gt.ObjectID = o.OBJECT_ID
INNER JOIN
(
 SELECT [object_id], SUM(row_count), SUM(used_page_count)
   FROM tempdb.sys.dm_db_partition_stats
   WHERE index_id IN (0,1)
   GROUP BY [object_id]
) AS x(id, rc, upc)
ON x.id = o.[object_id]
WHERE gt.DatabaseID = 2 
  AND gt.EventClass = 46 -- (Object:Created Event from sys.trace_events)  
  AND o.create_date >= DATEADD(ms, -100, gt.StartTime)   
  AND o.create_date <= DATEADD(ms, 100, gt.StartTime)

Buradaki sorun, bir tablo adını sorgu metniyle ilişkilendirmeye çalışıyor; bu pratik değildir, çünkü çoğu zaman, kullanıcı hala bu tabloya karşı bir sorgu yürütmez (bunu yaratan / dolduranı çalıştırmayı unutmayın).

Bununla birlikte, bu diğer okuyucular içindir (veya yükselttiğinizde sizin için), #temp tablosu bir yığınsa, 2012'den sonraki varsayılan izleme artık geçici tablo nesnesi oluşturmayı izlemez . Bunun bir tesadüf mü yoksa doğrudan 2012 ile başlayan tüm geçici tabloların negatifobject_id olduğu gerçeğinden mi emin değilim . Elbette, bu bilgileri toplamanıza ve izlemenize yardımcı olmak için Genişletilmiş Etkinliklere geçebilirsiniz, ancak bu muhtemelen çok fazla manuel çalışmadır (ve bunun artık izde olmadığını doğruladım - bunu seçemeyebilirsiniz Genişletilmiş Etkinlikler'de de görünebilir). Varsayılan iz irade PK veya başka bir kısıtlamayla veya oluşturma olayından sonra eklenen kısıtlamalar veya dizinlerle oluşturulmuş #temp tablolarını alın, ancak daha sonra yukarıdaki zamana dayalı kısıtlamaları gevşetmeniz gerekir (bir dizin 100 ms'den daha sonra oluşturulabilir oluşturulması).

Bu sitede yararlı olabilecek diğer bazı cevaplar:

Ayrıca, SQL Server 2012 ve sonraki sürümlerde bu bilgileri izlemek için özel bir Genişletilmiş Etkinlikler oturumu ile blog yazdım:

Ve Paul White doğrudan sayfa okuma hakkında blog yazdı (tam olarak kalbin zayıflığı için değil, herhangi bir şekilde otomatikleştirilmesi kolay değil):


5

İşte aradığınız bilgileri bulmaya başlamanızı sağlayacak bir sorgu:

select top 10
    tsu.session_id,
    tsu.request_id,
    r.command,
    s.login_name,
    s.host_name,
    s.program_name,
    total_objects_alloc_page_count = 
        tsu.user_objects_alloc_page_count + tsu.internal_objects_alloc_page_count,
    tsu.user_objects_alloc_page_count,
    tsu.user_objects_dealloc_page_count,
    tsu.internal_objects_alloc_page_count,
    tsu.internal_objects_dealloc_page_count,
    st.text
from sys.dm_db_task_space_usage tsu
inner join sys.dm_exec_requests r
on tsu.session_id = r.session_id
and tsu.request_id = r.request_id
inner join sys.dm_exec_sessions s
on r.session_id = s.session_id
outer apply sys.dm_exec_sql_text(r.sql_handle) st
where tsu.user_objects_alloc_page_count > 0
or tsu.internal_objects_alloc_page_count > 0
order by total_objects_alloc_page_count desc;

Bu sorgu, tahsis edilen / ayrılan sayfalar, görevlerin SQL metni (varsa) gibi en iyi 10 görev için yararlı bilgiler alır.

Bu DMV'ler harika bilgilerle doludur, bu nedenle daha fazla veriye ihtiyacınız varsa, çektiğiniz şeyle karıştırabilir ve eşleştirebilirsiniz. Ancak bu, mevcut tempdb tüketim görevlerini gidermek için bir başlangıç ​​noktası olmalıdır.


Çok iyi görünüyor teşekkürler. Garip olan şey tempdb üzerinde bir 'En iyi Tablolar tarafından Disk Kullanımı' raporu çalıştırırsanız, en fazla alanı kullanan tablo st.text'de görünmez. Sorguyu çalıştırdıktan sonra tablo hala orada.
SQLMIKE

1
@SQLMIKE sadece hangi tablonun en büyük olduğunu bilmek istiyorsanız, bunu alabilirsiniz tempdb.sys.dm_db_partition_stats. Ne yazık ki, hangi kopyasının #some_table_namehangi kullanıcıya ait olduğunu gerçekten söyleyemezsiniz veya her zaman belirli bir zamanda bu tabloya başvuran deyim metnini çekemezsiniz - bu, kullanıcının şu anda çalışmakta olduğu sorgu olmayabilir. Sen görmek isteyebilirsiniz , bu ve bu
Aaron Bertrand
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.