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):