Ho chiesto qualcosa da costruire nel 2007, su Connect. Questo è stato respinto per la versione 2008 e successivamente ignorato, fino alla morte di Connect alcuni anni fa. Ho provato a trovarlo sul nuovo sito di feedback per SQL Server , ma quella ricerca è un vero incendio del cassonetto. Il titolo della mia richiesta era "dmv per mappare la tabella temporanea su session_id" - poiché la ricerca può fare solo OR, "mappa della tabella temporanea" restituisce 118 pagine di risultati. Google sembra suggerire che l'oggetto non ha effettuato il taglio quando hanno ucciso Connect .
Nel frattempo, per SQL Server 2005 e 2008, dovresti essere in grado di estrarre queste informazioni dalla traccia predefinita:
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)
Senza vergogna sollevato da questo post sul blog di Jonathan Kehayias .
Per determinare l'utilizzo dello spazio, è possibile migliorarlo ulteriormente per unire i dati da viste come sys.db_db_partition_stats
, ad esempio:
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)
Il problema qui sta cercando di correlare il nome di una tabella con il testo della query; questo non è pratico, dal momento che la maggior parte delle volte l'utente non sta ancora eseguendo una query su quella tabella (non importa se esegue ancora quella che l'ha creata / popolata).
Tuttavia, e questo vale per altri lettori (o per te quando esegui l' aggiornamento), la traccia predefinita in 2012+ non tiene più traccia della creazione dell'oggetto tabella temporanea , se la tabella #temp è un heap. Non sono sicuro se questa sia una coincidenza o direttamente correlata al fatto che a partire dal 2012 tutte le tabelle temporanee ora hanno un valore negativoobject_id
. Ovviamente potresti passare a Eventi estesi per aiutarti a raccogliere e tracciare queste informazioni, ma è probabilmente un sacco di lavoro manuale (e ho solo verificato che questo non è più rintracciato in traccia - potresti non essere in grado di selezionarlo o negli Eventi estesi). La traccia predefinita lo farà raccogliere le tabelle #temp create con un PK o altro vincolo, o con vincoli o indici aggiunti dopo l'evento di creazione, ma poi si dovranno allentare le restrizioni temporali sopra (un indice può essere creato molto più tardi di 100 ms dopo creazione).
Alcune altre risposte su questo sito che potrebbero essere utili:
Ho anche scritto un blog su questo, con una sessione personalizzata di eventi estesi per tenere traccia di queste informazioni in SQL Server 2012 e versioni successive:
E Paul White ha scritto sul blog di leggere direttamente le pagine (non esattamente per i deboli di cuore, né facile da automatizzare in alcun modo):