Tôi đã yêu cầu một cái gì đó được xây dựng trở lại vào năm 2007, trên Connect. Điều này đã bị từ chối cho phiên bản 2008 và sau đó bị bỏ qua, cho đến khi Connect chết vài năm trước. Tôi đã cố gắng tìm nó trên trang web phản hồi mới cho SQL Server , nhưng tìm kiếm đó là một đám cháy tuyệt đối. Tiêu đề yêu cầu của tôi là "dmv để ánh xạ bảng tạm thời sang session_id" - vì việc tìm kiếm chỉ có thể thực hiện HOẶC, "bảng tạm thời bản đồ" trả về 118 trang kết quả. Google dường như đề xuất mặt hàng không thực hiện việc cắt giảm khi họ giết Connect .
Trong khi đó, đối với SQL Server 2005 và 2008, bạn sẽ có thể lấy thông tin này từ theo dõi mặc định:
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)
Không biết xấu hổ nhấc lên từ bài viết trên blog Jonathan Kehayias này .
Để xác định mức sử dụng không gian, bạn có thể tăng cường hơn nữa để tham gia dữ liệu từ các chế độ xem như sys.db_db_partition_stats
- ví dụ:
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)
Vấn đề ở đây là cố gắng tương quan tên bảng bằng văn bản truy vấn; điều này không thực tế, vì hầu hết thời gian, người dùng vẫn không thực hiện truy vấn đối với bảng đó (không bao giờ để ý chạy cái đã tạo / điền vào nó).
Tuy nhiên, và điều này là dành cho những người đọc khác (hoặc cho bạn khi bạn nâng cấp), theo dõi mặc định trong năm 2012+ không còn theo dõi việc tạo đối tượng bảng tạm thời , nếu bảng #temp là một đống. Không chắc chắn nếu đó là một sự trùng hợp ngẫu nhiên hoặc liên quan trực tiếp đến thực tế là bắt đầu từ năm 2012, tất cả các bảng tạm thời đều có kết quả âmobject_id
. Tất nhiên bạn có thể chuyển đến Sự kiện mở rộng để giúp bạn thu thập và theo dõi thông tin này, nhưng đó có thể là rất nhiều công việc thủ công (và tôi chỉ xác minh rằng điều này không còn được theo dõi trong dấu vết - bạn có thể không chọn được trong các sự kiện mở rộng hoặc). Theo dõi mặc định sẽ chọn các bảng #temp được tạo bằng PK hoặc các ràng buộc khác hoặc với các ràng buộc hoặc chỉ mục được thêm vào sau sự kiện tạo, nhưng sau đó bạn sẽ phải nới lỏng các hạn chế dựa trên thời gian ở trên (một chỉ mục có thể được tạo muộn hơn 100ms sau sự sáng tạo).
Một số câu trả lời khác trên trang web này có thể hữu ích:
Tôi cũng đã viết blog về điều này, với phiên Sự kiện mở rộng tùy chỉnh để theo dõi thông tin này trong SQL Server 2012 trở lên:
Và Paul White đã viết blog về việc đọc các trang trực tiếp (không chính xác cho người yếu tim, cũng không dễ tự động hóa theo bất kỳ cách nào):