Я попросив щось збудувати ще в 2007 році на Connect. Його було відхилено до випуску 2008 року та згодом проігноровано, поки Connect не померла кілька років тому. Я намагався знайти його на новому сайті зворотного зв’язку для SQL Server , але цей пошук - це абсолютна пожежа сміттєзвалища. Назва мого запиту була "dmv to map temp table to session_id" - оскільки пошук може робити АБО, "map temp table" повертає 118 сторінок результатів. Google, здається, припускає, що предмет не зробив розріз, коли вони вбили Connect .
Тим часом для SQL Server 2005 та 2008 року ви повинні мати змогу витягнути цю інформацію із сліду за замовчуванням:
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)
Безсоромно піднявся з цієї публікації блогу Джонатана Кехаяса .
Щоб визначити використання місця, ви можете додатково покращити це, щоб приєднатись до даних із видів, наприклад sys.db_db_partition_stats
- наприклад:
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)
Проблема тут полягає у спробі співвіднести назву таблиці з текстом запиту; це просто не практично, оскільки більшість часу користувач все ще не виконує запит проти цієї таблиці (не майте на увазі, як і раніше працює той, хто створив / заселив його).
Однак, і це стосується інших читачів (або для вас, коли ви оновлюєтесь), за замовчуванням слід у 2012+ більше не відстежує створення об’єктів темп-таблиці , якщо таблиця #temp - це купа. Не впевнений, чи це збіг чи безпосередньо пов'язаний з тим, що починаючи з 2012 року, всі тимчасові таблиці мають мінусobject_id
. Ви, звичайно, можете перейти до Розширених подій, щоб допомогти вам збирати та відслідковувати цю інформацію, але це, можливо, багато ручної роботи (і я лише переконався, що це більше не простежується в сліді - ви, можливо, не зможете її вибрати в розширених подіях). Трасування за замовчуванням буде підберіть таблиці #temp, створені з ПК або іншим обмеженням, або із обмеженнями або індексами, доданими після події створення, але тоді вам доведеться послабити вищезазначені часові обмеження (індекс можна створити набагато пізніше ніж через 100 мс після створення).
Ще кілька відповідей на цьому веб-сайті, які можуть бути корисними:
Я також вела блог про це, за допомогою спеціального сеансу розширених подій для відстеження цієї інформації в SQL Server 2012 і новіших версіях:
А Пол Уайт веде блог про читання сторінок безпосередньо (не саме для слабкого серця, ані легко автоматизувати жодним чином):