Saya meminta sesuatu untuk dibangun kembali pada tahun 2007, di Connect. Ini ditolak untuk rilis 2008, dan kemudian diabaikan, sampai Connect meninggal beberapa tahun yang lalu. Saya mencoba untuk menemukannya di situs umpan balik baru untuk SQL Server , tetapi pencarian itu adalah api tempat sampah mutlak. Judul permintaan saya adalah "dmv untuk memetakan tabel temp ke session_id" - karena pencarian hanya dapat melakukan ATAU, "peta temp table" mengembalikan 118 halaman hasil. Google tampaknya menyarankan item tersebut tidak memotong ketika mereka membunuh Connect .
Sementara itu, untuk SQL Server 2005 dan 2008, Anda harus dapat menarik informasi ini dari jejak default:
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)
Tanpa malu-malu diangkat dari posting blog Jonathan Kehayias ini .
Untuk menentukan penggunaan ruang, Anda dapat lebih lanjut meningkatkannya untuk bergabung dalam data dari tampilan seperti sys.db_db_partition_stats
- misalnya:
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)
Masalahnya di sini adalah mencoba menghubungkan nama tabel dengan teks kueri; ini tidak praktis, karena sebagian besar waktu, pengguna masih tidak menjalankan kueri terhadap tabel itu (apalagi masih menjalankan yang membuat / mengisi itu).
Namun, dan ini untuk pembaca lain (atau untuk Anda saat Anda meningkatkan), jejak default di 2012+ tidak lagi melacak pembuatan objek temp table , jika tabel #temp adalah heap. Tidak yakin apakah itu kebetulan atau terkait langsung dengan fakta bahwa mulai tahun 2012 semua tabel temp sekarang memiliki negatifobject_id
. Anda tentu saja dapat pindah ke Acara yang Diperpanjang untuk membantu Anda mengumpulkan dan melacak informasi ini, tetapi itu mungkin banyak pekerjaan manual (dan saya hanya memverifikasi bahwa ini tidak lagi dilacak dalam jejak - Anda mungkin tidak dapat mengambilnya di Extended Events juga). Jejak default akan mengambil tabel #temp yang dibuat dengan PK atau kendala lainnya, atau dengan kendala atau indeks ditambahkan setelah acara pembuatan, tetapi kemudian Anda harus melonggarkan pembatasan berbasis waktu di atas (indeks dapat dibuat lebih dari 100 ms setelah penciptaan).
Beberapa jawaban lain di situs ini yang mungkin berguna:
Saya juga membuat blog tentang hal ini, dengan sesi Acara yang diperluas khusus untuk melacak informasi ini di SQL Server 2012 dan lebih tinggi:
Dan Paul White telah menulis blog tentang membaca halaman secara langsung (tidak hanya untuk orang yang lemah hati, juga tidak mudah untuk diotomatisasi dengan cara apa pun):